Anonymous
Правильный способ объединить несколько эффектов с помощью libSox и прочитать выходные данные.
Сообщение
Anonymous » 27 дек 2025, 14:03
Я пытаюсь программно применить несколько эффектов с помощью libSox и в настоящее время не могу понять, правильно ли я это делаю. Например, мне нужно применить эффекты темпа и усиления и прочитать полученный звук в буфере для дальнейшей обработки. Документации действительно мало, и погуглить не получилось.
Вот мой код:
Код: Выделить всё
sox_format_t* input = sox_open_read("", NULL, NULL, NULL);
//sox_format_t* out;
sox_format_t* output = sox_open_memstream_write(&buffer, &buffer_size,
&input->signal, &input->encoding, "raw", NULL);
//assert(output = sox_open_write("/home/egor/hello_processed.wav", &input->signal, NULL, NULL, NULL, NULL));
sox_effects_chain_t* chain = sox_create_effects_chain(&input->encoding, &output->encoding);
char* sox_args[10];
//input effect
sox_effect_t* e = sox_create_effect(sox_find_effect("input"));
sox_args[0] = (char*)input;
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal, &input->signal) ==
SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("tempo"));
std::string tempo_str = "1.01";
sox_args[0] = (char*)tempo_str.c_str();
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal,&input->signal) ==
SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("output"));
sox_args[0] = (char*)output;
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal, &input->signal) ==
SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
static const size_t maxSamples=4096;
sox_sample_t samples[maxSamples];
std::vector audio_buffer;
for (size_t r; 0 != (r=sox_read(output,samples,maxSamples));)
for(int i=0;i
Подробнее здесь: [url]https://stackoverflow.com/questions/51908577/proper-way-to-chain-several-effects-with-libsox-and-read-the-output-data[/url]
1766833414
Anonymous
Я пытаюсь программно применить несколько эффектов с помощью libSox и в настоящее время не могу понять, правильно ли я это делаю. Например, мне нужно применить эффекты темпа и усиления и прочитать полученный звук в буфере для дальнейшей обработки. Документации действительно мало, и погуглить не получилось. Вот мой код: [code]sox_format_t* input = sox_open_read("", NULL, NULL, NULL); //sox_format_t* out; sox_format_t* output = sox_open_memstream_write(&buffer, &buffer_size, &input->signal, &input->encoding, "raw", NULL); //assert(output = sox_open_write("/home/egor/hello_processed.wav", &input->signal, NULL, NULL, NULL, NULL)); sox_effects_chain_t* chain = sox_create_effects_chain(&input->encoding, &output->encoding); char* sox_args[10]; //input effect sox_effect_t* e = sox_create_effect(sox_find_effect("input")); sox_args[0] = (char*)input; assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &input->signal, &input->signal) == SOX_SUCCESS); free(e); e = sox_create_effect(sox_find_effect("tempo")); std::string tempo_str = "1.01"; sox_args[0] = (char*)tempo_str.c_str(); assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &input->signal,&input->signal) == SOX_SUCCESS); free(e); e = sox_create_effect(sox_find_effect("output")); sox_args[0] = (char*)output; assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &input->signal, &input->signal) == SOX_SUCCESS); free(e); sox_flow_effects(chain, NULL, NULL); static const size_t maxSamples=4096; sox_sample_t samples[maxSamples]; std::vector audio_buffer; for (size_t r; 0 != (r=sox_read(output,samples,maxSamples));) for(int i=0;i Подробнее здесь: [url]https://stackoverflow.com/questions/51908577/proper-way-to-chain-several-effects-with-libsox-and-read-the-output-data[/url]