2017-08-23 15 views
-1

私はCでプログラミングを始めました。 wavオーディオファイルの値を解析して配列buf[num_samples]に書き込むコードを書こうとしています。 num_samplesは、オーディオファイルのヘッダーに含まれている情報を読み取ることで定義されます(オーディオファイルは膨大な量のサンプルで構成されるため、uint32_t変数として定義されています)。私は、パラメータBit_per_sample = 16で動作レコーダーを使用しているためfread()の2番目の引数が2であるfread()で配列を記入してください

uint16_t buf[num_samples]; 

// Open WAV file with FFmpeg and read raw samples via the pipe. 
FILE *pipe = popen("ffmpeg -i 45s.wav -f s16le -ac 1 -", "r"); 

// check on the pipe work 
if ((pipe = popen("ffmpeg -i 45s.wav -f s16le -ac 1 -", "r"))==NULL) { 
    perror("ERROR\n"); 
} 

fread(buf, 2, num_samples, pipe); 
pclose(pipe); 

は(バイトを参照):私は、コードのこの部分を発見しました。

しかし、実際にはアレイには「非論理的な値」が入っています。波形を表す値(多かれ少なかれ、それらは区間[-20,000; 32,767]に属しているはずです)を期待しています。
正しい塗りつぶしを確認するために、i=0からi=num_samples-1%dbuf[i]のprintfを追加しました。私は出力から得た値のいくつかの下には:

64947 65002 65046 65080 65110 65150 65188 65236 
65264 65306 65338 65378 65434 65472 65517 8  
81  128  168  206  241  268  306  322  
424  458  497  520  543  566  586  622  
676  699  728  745  765  796  825  840  
917  950  970  996  1018  1040  1064  1072 
1106  1128  

誰も私を助けたり、私に有用な助言いくつかを与えることはできますか?
私はあなたの時間を無駄にしないことを願って、事前にありがとうございます。

+0

を使用し確認してください。あなたは 'popen()'を2回呼びます。また、16ビット符号付き整数は35,000に達することができません... – neuhaus

+0

間違ったフォーマット指定子の問題でもあります。正確な配列宣言とは何ですか?どのように印刷しますか? –

+0

正確な配列宣言は、num_samplesの位置を含むint配列です。私は次のコードでそれを印刷します:uint32_t i; (i = 0; i

答えて

1

タイプが間違っています。uint16_tを符号なしタイプとして使用しており、符号付きの値が[-20,000; 32,767]の間であると想定しています。

バッファがint16_t buf[num_samples];と宣言して、バッファが2(符号付き)バイトの要素として宣言されるようにします。また

は、開いて、パイプがバイト順の問題である可能性があり

FILE *pipe; 
if ((pipe = popen("ffmpeg -i 45s.wav -f s16le -ac 1 -", "r"))==NULL) { 
    perror("ERROR\n"); 
    exit(1); 
} 
+0

'perror'は終了しないので、exitも追加する必要があります:) –

関連する問題