gpt4 book ai didi

c - 使用 fread() 填充数组

转载 作者:行者123 更新时间:2023-11-30 19:08:10 25 4
gpt4 key购买 nike

我刚刚开始用 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 的 printf的buf[i]i=0 的循环中至i=num_samples-1 。下面是我从输出中获得的一些值:

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

有人可以帮助我或给我一些有用的建议吗?
预先感谢您,希望我没有浪费您的时间。

最佳答案

您的类型错误,您使用 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);
}

关于c - 使用 fread() 填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com