使用fread()填充数组

时间:2017-08-23 13:17:18

标签: c arrays audio fread

我刚开始用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])。
为了验证数组的正确填充,我在%dbuf[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     

有人可以帮我或给我一些有用的建议吗? 提前谢谢你,希望我不要浪费你的时间。

1 个答案:

答案 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);
}