c - 在 C/C++ 中在 Raspberry Pi 中播放 WAV,必须使用 dsp?
问题描述
我目前正在尝试使用 C 或 C++ 播放 WAV 文件,(我想知道如何详细播放 WAV 文件)。但是,我发现的所有示例代码都试图首先检测 /dev/dsp(例如github 示例)。我正在研究 Raspberry Pi,但找不到 dsp 在哪里。
我的问题是我必须使用 dsp 才能使 wav 播放工作吗?否则,有没有其他的解决方案?而且我以前从未使用过dsp。
(ps:我已经知道wav文件的格式,也知道怎么读,只是好奇玩一下)。
解决方案
简而言之,您的问题:
我必须使用 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 任务(特别是在Python或Matlab / Octave中,因为这些通常是音频 DSP 原型设计的首选)。如果你想进入音频编程,我认为这是一个很好的开始方式,如果你已经具备 C/C++ 知识,那么将高级语言理论转移到 C/C++ 会很容易:)
推荐阅读
- django - ManyToManyField 未保存在数据库中
- r - 为什么列上的 stringr::str_match 返回一个矩阵?
- php - 自定义分类的 Woocommerce 产品存档页面
- c# - C#如何在将用户输入放入我的数组之前验证用户输入?
- sql - postgresql - datetime:postgresql 是否有 mysql 中的 datetime 类型?
- android - 如何在kotlin中将按钮的背景资源从一个自定义drawable设置为另一个自定义drawable?
- java - 如何使用 AndroidStudio 中的 Java 方法从 Firebase 实时数据库中读取值?
- javascript - article.createdAt.toLocalDateString 不是函数
- python-3.x - __init__.py 中的 google.cloud 命名空间导入错误
- java - Pircbotx 通道 setMode() 在 main() 方法中不起作用