私は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
の%d
のbuf[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
誰も私を助けたり、私に有用な助言いくつかを与えることはできますか?
私はあなたの時間を無駄にしないことを願って、事前にありがとうございます。
を使用し確認してください。あなたは 'popen()'を2回呼びます。また、16ビット符号付き整数は35,000に達することができません... – neuhaus
間違ったフォーマット指定子の問題でもあります。正確な配列宣言とは何ですか?どのように印刷しますか? –
正確な配列宣言は、num_samplesの位置を含むint配列です。私は次のコードでそれを印刷します:uint32_t i; (i = 0; i