2

libsox プログラミングは初めてで、「a.wav」という名前のステレオ オーディオから chennel を削減し、次のコードでモノラル オーディオ「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 の半分でした。私のコードに何か問題がありますか?

どんな返信でも大歓迎です!

4

1 に答える 1

1

sox_add_effect()入力信号 (3 番目のパラメーター) を上書きして、この処理ステップの後に信号のプロパティを記述し、次のエフェクトに渡すことができるようにします。ただし、あなたの場合、変更されたシグナル情報は読み取りハンドラーによっても使用され、内容は読み取られるファイルと一致しなくなります。

によって返される信号情報のコピーを作成する必要があります。これを呼び出しsox_open_read()に 3 番目のパラメータとして渡すことができます。sox_add_effect()

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

そのため、リリースされたバージョンではなく、git リポジトリでの最新バージョンを確認するように警告しました。example3.c

于 2013-06-18T15:34:10.003 に答える