首页 > 解决方案 > 在 C/C++ 中在 Raspberry Pi 中播放 WAV,必须使用 dsp?

问题描述

我目前正在尝试使用 C 或 C++ 播放 WAV 文件,(我想知道如何详细播放 WAV 文件)。但是,我发现的所有示例代码都试图首先检测 /dev/dsp(例如github 示例)。我正在研究 Raspberry Pi,但找不到 dsp 在哪里。

我的问题是我必须使用 dsp 才能使 wav 播放工作吗?否则,有没有其他的解决方案?而且我以前从未使用过dsp。

(ps:我已经知道wav文件的格式,也知道怎么读,只是好奇玩一下)。

标签: caudioraspberry-pisignal-processingwav

解决方案


简而言之,您的问题:

我必须使用 DSP 才能使 wav 播放工作吗?

答案是不。

DSP(数字信号处理)是用于描述获取原始数字信号并查看波形然后应用某种处理(即滤波、延迟、调制……不胜枚举)的术语。如果您有兴趣,我相信您会很容易地找到更多关于 DSP 的信息,但这里有一篇简短的文章可供您入门。

由于您要做的只是播放 .wav 文件,因此该过程只是读取 .wav 文件头信息(找出元数据 -> 采样率、样本数...),然后播放 .wav具有标题信息中描述的正确参数的数据。

1.播放.wav原始数据

既然您说您已经知道如何读取 .wav 文件,我假设您只想播放音频数据数组?

在 C/C++ 中(在操作系统上)执行此操作的最常见技术是使用portaudio。这是一个用 C 编写的跨平台(Mac、Win 和 Linux 支持)音频 IO 库,可以从 C/C++ 中调用。他们在文档中提供了用于读取/写入 .wav 文件以及非阻塞和阻塞播放的示例。我认为这就是您正在寻找的东西,如果您遇到困难,有很多 SO 帖子或可以帮助您的人。

如果这对您的项目有任何用途,它还支持实时录制和回放(即,如果您愿意,可以让您进行实时 DSP)。

还有许多其他语言的portaudio绑定,例如PyAudio (Python)、PlayRec (Matlab/Octave)、rust-portaudio (Rust)……如果您需要其他语言,还有许多其他绑定。

否则会有较低级别的库可以为您提供更多访问权限,但这有时不是您所需要的,但这里是ALSA 项目示例的链接如果在 Linux 上构建Portaudio ,则使用ALSA

2.尝试一些DSP!

由于您已经拥有音频数据,因此您可以使用它来做您想做的事情。如果这是一个学习项目,我肯定会建议尝试一些 DSP 编程,因为它有助于所有类型的信号处理(单一图像视频和更困难的领域 -> 基本上它与音频的理论完全相同)。

我建议用高级语言尝试简单的 DSP 任务(特别是在PythonMatlab / Octave中,因为这些通常是音频 DSP 原型设计的首选)。如果你想进入音频编程,我认为这是一个很好的开始方式,如果你已经具备 C/C++ 知识,那么将高级语言理论转移到 C/C++ 会很容易:)


推荐阅读