在 C/C++ 中在树莓派中播放 WAV,必须使用 dsp?
Posted
技术标签:
【中文标题】在 C/C++ 中在树莓派中播放 WAV,必须使用 dsp?【英文标题】:Play WAV in Raspberry Pi in C/C++, have to use dsp? 【发布时间】:2018-07-05 17:59:58 【问题描述】:我目前正在尝试使用 C 或 C++ 播放 WAV 文件,(我想详细了解如何播放 WAV 文件)。但是,我发现的所有示例代码都试图首先检测 /dev/dsp(例如github example)。我正在研究 Raspberry Pi,但我找不到 dsp 在哪里。
我的问题是我必须使用 dsp 才能使 wav 播放工作吗?否则,有没有其他的解决方案?而且我以前从没用过 dsp。
(ps:我已经知道wav文件的格式,也知道怎么读,就是好奇玩一下)。
【问题讨论】:
你提到的那个 repo 已经过时了......现代 linux 操作系统不再有那个设备......有很多关于如何使用 x,y,z 播放音频的教程 @ScottStensland 我来这里问问题只是因为我找不到除了 dsp 之外的任何东西。让我澄清一下我的问题,我不想使用诸如 aplay 之类的简单命令来播放 wav 文件,我想知道 如何编写/在哪里编写音频信号以便播放。我想从这里得到一些提示。 【参考方案1】:简而言之你的问题:
我必须使用 DSP 才能播放 wav 吗?
答案是否定的。
DSP(数字信号处理)是用于描述获取原始数字信号并查看波形然后应用某种处理(即滤波、延迟、调制……不胜枚举)的术语。如果您有兴趣,我相信您会很容易地找到更多关于 DSP 的信息,但这里有一个 short article 可以开始。
由于您只想播放 .wav 文件,因此该过程只是读取 .wav 文件header information(找出元数据 -> 采样率、采样数...),然后播放使用标题信息中描述的正确参数返回 .wav 数据。
1。播放 .wav 原始数据
既然您说您已经知道如何读取 .wav 文件,我假设您只想播放音频数据数组?
在 C/C++ 中(在操作系统上)执行此操作的最常见技术是使用 portaudio。这是一个用 C 编写的跨平台(Mac、Win 和 Linux 支持)音频 IO 库,可以从 C/C++ 中调用。他们提供examples in their documentation 用于读取/写入 .wav 文件,以及非阻塞和阻塞播放。我认为这就是您正在寻找的东西,如果您遇到困难,有很多 SO 帖子或可以帮助您的人。
如果对您的项目有任何用途,它还支持实时录制和回放(即,如果您愿意,可以让您进行实时 DSP)。
portaudio 也有许多其他绑定在其他语言中,例如 PyAudio (Python)、PlayRec (Matlab/Octave)、rust-portaudio (Rust)...以及许多其他语言,如果您需要它们不同的语言。
否则会有较低级别的库可以为您提供更多访问权限,但这有时不是您所需要的,但这里有一个link to the ALSA project examples。 Portaudio 如果在 Linux 上使用 ALSA 构建,则使用它。
2。试试 DSP!
由于您已经拥有音频数据,因此您可以使用它来做您想做的事情。如果这是一个学习项目,我肯定会建议尝试一些 DSP 编程,因为它有助于所有类型的信号处理(singular images、videos 和更困难的领域 -> 基本上它与音频的理论完全相同)。
我建议使用高级语言尝试简单的 DSP 任务(尤其是在 Python 或 Matlab/Octave,因为这些通常是音频 DSP 原型设计的首选)。如果你想进入音频编程,我认为这是一个很好的开始方式,如果你已经具备 C/C++ 知识,那么将高级语言理论转移到 C/C++ 会很容易:)
【讨论】:
以上是关于在 C/C++ 中在树莓派中播放 WAV,必须使用 dsp?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 和 QML Oscilloscope 动态绘图效果很好,但相同的程序在树莓派中不起作用,替换功能不起作用