Сокращение канала из wav файла с помощью libsox

Я новичок в программировании на libsox, и я хочу уменьшить канал из стереозвука с именем a.wav, а затем сгенерировать монофонический звук b.wav со следующим кодом:

sox_format_t * in, * out; 
sox_effects_chain_t * chain;
sox_effect_t * e;
char * args[10];

sox_init();
in = sox_open_read("E:\\a.wav", NULL, NULL, NULL);
out = sox_open_write("E:\\b.wav", &in->signal, NULL, NULL, NULL, NULL);
out->signal.channels = 1;

chain = sox_create_effects_chain(&in->encoding, &out->encoding);
e = sox_create_effect(sox_find_effect("input"));
sox_add_effect(chain, e, &in->signal, &in->signal);

e = sox_create_effect(sox_find_effect("channels"));
sox_add_effect(chain, e, &in->signal, &out->signal);

e = sox_create_effect(sox_find_effect("output"));
sox_add_effect(chain, e, &in->signal, &out->signal);

sox_flow_effects(chain, NULL, NULL);
sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_format_quit();

После запуска приложения был сгенерирован монофонический звук «b.wav», но продолжительность звука была вдвое меньше, чем у a.wav. Что-то не так с моим кодом?

Любой ответ будет оценен!


person gold_luck    schedule 17.06.2013    source источник


Ответы (1)


sox_add_effect() перезаписывает входной сигнал (третий параметр) для описания свойств сигнала после этого шага обработки, чтобы вы могли передать его следующему эффекту. Однако в вашем случае измененная информация о сигнале также используется обработчиком чтения, и содержимое больше не соответствует читаемому файлу.

Вам нужно будет сделать копию информации о сигнале, возвращенной sox_open_read(), которую вы затем можете передать в качестве третьего параметра вызовам sox_add_effect():

sox_signalinfo_t interm_signal = in->signal;
...
sox_add_effect(chain, e, &interm_signal, &out->signal);

Вот почему я предупредил, чтобы вы искали новейшую версию example3.c в репозитории git, а не в выпущенных версиях.

person chirlu    schedule 18.06.2013
comment
Спасибо за ваш ответ! Я почти забыл этот вопрос, потому что уехал отсюда на пару месяцев. Мне очень жаль, что в API все еще есть ошибка, и его трудно использовать. Наконец, я делаю преобразование командной строкой с исполняемой программой sox. Спасибо! Счастливого дня~ - person gold_luck; 24.02.2014