我的 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 线音频播放器的主要内容,如果未能解决你的问题,请参考以下文章

当另一个应用开始播放音频时,如何自动暂停我的应用中的音频播放器?

更改音频播放器的轨道位置

IE10 Windows7 -- 音频标签从不播放音频?

如何在iphone中同时播放音频和视频

cocos creater 鸿蒙 音频卡死 播放失败 不回调

我们可以在后台播放音频吗