グループ、
目的: sox-resample ライブラリを使用して、入力レート (44.1Khz、2 チャネル、16 ビット) から出力レート (16Khz、1 チャネル、16 ビット) にダウンサンプリングしようとしています。このプロセスに sox-resample ライブラリを使用することは可能ですか。
Sox Resample ライブラリのソースはこちら: http://sourceforge.net/p/soxr/code/ci/master/tree/
私はこのAPIをsoxr_oneshotしてみましたが、生成された出力には入力バッファの元の音声がなく、元の音声入力とはかけ離れた奇妙な音声出力があります。
soxr_create および soxr_process API も試しましたが、正しい出力が得られませんでした。
これらの API (soxr_oneshot、soxr_create、および soxr_process) にチャネル数をダウングレードするオプションがあるかどうか、および 16 ビットまたは 8 ビットを指定できるかどうかはわかりません。
また、sox_create_effect/sox_add_effect などの LibSox API を使用する必要があるかどうか、およびそれがより適切なオプションであるかどうかもわかりません。
soxr_oneshot を使用したサンプル コードを次に示します。何が問題なのか、または何か提案があればお知らせください。
#define INPUT_RATE (44100)
#define OUTPUT_RATE (16000)
#define INPUT_NUM_CHANNELS (2)
#define OUTPUT_NUM_CHANNELS (1)
#define OUTPUT_BLOCK_ALIGN (2)
/*
ibuf - pointer to input buffer.
length - length of input buffer.
block_align - sample size of input rate.
*/
static int sox_test_function(void *ibuf, UINT32 length, UINT32 block_align)
{
size_t olen = (size_t)((length * OUTPUT_RATE * OUTPUT_NUM_CHANNELS)/ (INPUT_RATE * OUTPUT_NUM_CHANNELS));
float * obuf = (float *)malloc(OUTPUT_BLOCK_ALIGN * olen);
memset(obuf, 0, (OUTPUT_BLOCK_ALIGN * olen));
size_t odone;
FILE *ofile;
UINT32 written = 0;
//SKR: Need to find out, if we can downgrade # of channels..can we do that..??
//also not sure..how to specify 16 bit/8 bit..etc..
soxr_error_t err = soxr_oneshot(
INPUT_RATE,
OUTPUT_RATE,
1,
ibuf , length/block_align, NULL,
obuf, olen/OUTPUT_BLOCK_ALIGN, &odone,
NULL,
NULL,
NULL);
ofile = fopen("nwave_file_16k_pcm.raw", "wb");
if (ofile == NULL) {
perror("Invalid file specified.");
exit(-1);
}
written = fwrite(obuf, OUTPUT_BLOCK_ALIGN, odone, ofile); // Consume output.
return 0;
}
何が間違っているのか、何か提案があれば教えてください。