我正在尝试使用libsox来增加wav文件的频道。 我已经阅读了相关问题:Reducing a channel from wav file using libsox 我还阅读了libsox的exampl3.c。 我将in-> signal的深层副本作为interm_signal。 但是生成的文件仍是原始文件的一半。
这是我的代码:
int main(int argc, char * argv[])
{
sox_format_t *input = NULL;
sox_format_t *output = NULL;
sox_effects_chain_t *chain = NULL;
sox_effect_t *e = NULL;
char * args[10];
assert(sox_init()==SOX_SUCCESS);
assert(input = sox_open_read(argv[1], NULL, NULL, NULL));
sox_signalinfo_t output_signal;
output_signal = input->signal; /** Deep Copy */
output_signal.channels = 2;
assert(output = sox_open_write(argv[2], &output_signal, NULL, NULL, NULL, NULL));
chain = sox_create_effects_chain(&input->encoding, &output->encoding);
sox_signalinfo_t interm_signal;
interm_signal = input->signal; /** Deep Copy */
e = sox_create_effect(sox_find_effect("input"));
args[0] = (char *)input, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &interm_signal, &input->signal) == SOX_SUCCESS);
free(e);
// output->signal.rate = 16000;
// e = sox_create_effect(sox_find_effect("rate"));
// args[0]="16000", assert(sox_effect_options(e, 0, args) == SOX_SUCCESS);
// // e->handler.flags |= SOX_EFF_LENGTH;
// assert(sox_add_effect(chain, e, &interm_signal, &output->signal) == SOX_SUCCESS);
// free(e);
// output->signal.channels = 2;
e = sox_create_effect(sox_find_effect("channels"));
assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &interm_signal, &output->signal) == SOX_SUCCESS);
free(e);
// output->signal.precision = 8;
e = sox_create_effect(sox_find_effect("output"));
args[0] = (char *)output, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &interm_signal, &output->signal) == SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
sox_delete_effects_chain(chain);
// free(output_signal);
// free(interm_signal);
sox_close(output);
sox_close(input);
sox_quit();
return 0;
}