我刚开始用C编程。
我正在尝试编写一个能够分析wav音频文件中的值并将它们写入数组buf[num_samples]
的代码; num_samples
是通过读取音频文件标题中包含的信息来定义的(它被定义为uint32_t
变量,因为音频文件可能包含大量样本)。我找到了这段代码:
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);
fread()
的第二个参数是2(指字节),因为我使用的是一个使用参数Bit_per_sample = 16
的记录器。
然而有问题,实际上数组中充满了“不合逻辑的值”:我希望表示波形的值(或多或少它们应该属于区间[-20,000; 32,767]
)。
为了验证数组的正确填充,我在%d
到buf[i]
的cicle中添加了i=0
i=num_samples-1
的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 :(得分:1)
您的类型错误,您使用uint16_t
作为无符号类型,并期望在[-20,000; 32,767]
之间签名。
将buf声明为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);
}