我的 10 线音频播放器
Posted
技术标签:
【中文标题】我的 10 线音频播放器【英文标题】:My 10 Line Audio Player 【发布时间】:2010-11-25 17:13:19 【问题描述】:我只想制作最简单的 WAV 播放器。 这是我的代码。
#include <stdio.h>
int main()
FILE* speaker = fopen("/dev/audio", "wb");
FILE* music = fopen("bugsbunny2.wav", "rb");
char data[16];
while(!feof(music))
fread(data, sizeof(char), sizeof(data), music);
fwrite(data, sizeof(char), sizeof(data), speaker);
return 0;
这会播放声音,但是太吵了。很难理解。 我想我缺少缓冲区/块大小 实际的块大小是多少? 或者我怎样才能得到实际的块大小?
【问题讨论】:
what 块的大小? 4 个字节是指针的大小,即 sizeof(data)。我会说你永远不会看到集群大小低于 512 字节的系统,所以创建一个至少有这个大小的缓冲区。 另请注意,您最多错过了 3 个字节的 wav...考虑一下...如果您显着增加读取缓冲区的大小并且不先纠正该错误,您将大大错过更多的字节,和 bugs bunny 最终听起来就像一个 BUG :) 最简单的 WAV 播放器可能是 Windows 或 Windows shell 可能提供的一个微不足道的“使用此文件名播放 wav”API 函数。 @TheBlastOne:对不起,我不明白。您是在谈论检查 WAV 标头吗?顺便说一句,我正在用最近的编辑它。请检查编辑 现在我不明白。您不应该 fwrite 与 fread read 一样多的字节(即作为函数结果返回的大小)吗?否则,即使文件的最后一个块是 1 个字节(因为它的大小不能被 16 整除),您也会写入 16 个字节。 【参考方案1】:我认为,您应该对 wav 文件进行一些基本解析(另外,如果需要,将字节从 Little Endian 转换为 Big Endian [顺便说一句,这可能是噪音的来源])或者,至少,跳过你不感兴趣的部分,因为现在你甚至不知道文件中样本的大小(例如,在我得到的一个测试 wav 文件中,样本大小是 24 字节)。
我建议你阅读WAV file specification。
【讨论】:
是的,我也这么认为。我目前正在阅读规范。然而它似乎太复杂了。我认为 WAV 太容易了。 不,它 [相对] 很简单:您需要知道数据部分从哪里开始以及在一个样本上花费了多少字节 [当然,还要将样本从 LE 转换为 BE]。跨度> 但即使我不跳过标题部分,它也不应该是整个音频的问题。它只会在最初的几微秒内发出噪音。但其余的应该没问题。而且我还完成了 LEto BE 转换。现在我听到一声长长的哔哔声和嘈杂的声音。 ccrma.stanford.edu/courses/422/projects/WaveFormat 我也发现这个很有趣。【参考方案2】:本地data
没有分配存储空间,但您的代码正在对其进行读写。尽管看起来您正在尝试在循环的每次迭代中读取和写入 16 个字节的存储空间,但基于大小。请改用以下内容
char data[16];
while(!feof(music))
fread(data, sizeof(char), sizeof(data), music);
fwrite(data, sizeof(char), sizeof(data), speaker);
【讨论】:
【参考方案3】:怎么样
#include <stdio.h>
int main()
FILE* speaker = fopen("/dev/audio", "wb");
FILE* music = fopen("bugsbunny2.wav", "rb");
char data[16];
while(!feof(music))
fwrite(data, sizeof(data),
fread(data, sizeof(char), sizeof(data), music),
speaker);
return 0;
?
fread
返回实际读取的字节数。
但是,我不确定您是否可以将任何 wav 文件塞入音频设备并听到有用的内容...我认为“音频”不是 WAV 消费者。
也可以尝试使用 Data[1024] 或 Data[16384]。
【讨论】:
以上是关于我的 10 线音频播放器的主要内容,如果未能解决你的问题,请参考以下文章
当另一个应用开始播放音频时,如何自动暂停我的应用中的音频播放器?