泰山派音频操作

dooooit_d000006
原创
发布时间: 2025-06-25 11:07:00 | 阅读数 0收藏数 0评论数 0
封面
从单片机到Linux嵌入式开发过渡中,我们得到的硬件资源激增,这极大地促进了更为复杂应用的开发工作。其中,多媒体性能的提升尤为关键。在微控制器(MCU)环境下,实现录音和放音功能往往非常麻烦,因为它需要我们手动处理音频数据,进行存储和播放。而在Linux嵌入式开发环境中,许多这样的底层工作已经由操作系统层面的移植和抽象化处理完成。通过使用这些预先移植的操作系统,我们可以直接利用现成的录音和放音功能,极大简化了开发流程。这可以为我们节省宝贵时间,专注于应用的开发。

准备工作:

材料:

材料名称
数量
备注
开发板
1
RK3566
咪头麦克风
1
喇叭扬声器
1
导线
1
1

硬件连接

我们使用RK3566开发板上由PMIC提供的单声道功放模拟输出与模拟输入进行外部声音信号的播放与采集。立创开发板通过四针接口引出了咪头麦克风与扬声器咪头两根线接MIC1P与GND,扬声器两根线接SPK_OUTP与SPK_OUTN。在其他的3566开发板上可能是通过3.5mm接口引出的,如香橙派,鲁班猫等。

2

软件连接

通过SSH,UART等方法连接开发板,进入命令行。

3

声音录制

通过arecord指令可以进行声音录制。

arecord 命令有很多可用的选项,可以用来调整录音的各种设置。以下是一些常见的参数:

-D:指定录音设备的名称。例如 -D hw:0,0 会指定硬件设备0的子设备0。

-t:指定文件类型。例如 -t wav 或 -t raw。

-d:指定记录的持续时间(秒)。例如 -d 10 会录音10秒。

-f:指定采样格式。常见的格式有 S8(有符号8位)、U8(无符号8位)、S16_LE(有符号16位小端)、S16_BE(有符号16位大端)、S24_LE(有符号24位小端)、S32_LE(有符号32位小端)等。

-r:指定采样率。例如 -r 48000 会设置采样率为48000Hz。

-c:指定声道数。例如 -c 2 会录制立体声音频。

-q:启用安静模式,不输出任何信息。

-M:启用 mmap 模式。

-F:指定帧大小(用于某些高级用途)。

-B:指定缓冲区大小(用于某些高级用途)。

--max-file-time:指定文件的最大持续时间,在这段时间后,arecord 会创建一个新文件继续录音。

--process-id-file:将进程 ID 写入指定文件,通常用于脚本控制。

--use-strftime:在文件名中使用 strftime 变量,可以用于创建基于时间的文件名。

这里我们不指定录音的长度,录制一段44.1khz采样率的单声道音频。

arecord -c 1 -r 44100 -f S16_LE /tmp/record.wav

录制一段单声道,44.1khz,16位小端存储的音频,保存为record.wav文件。执行指令以后按Ctrl+C停止录音。

录制完成以后可以 用ls指令看到录制出的音频文件。


4

声音播放

播放音频文件在Linux系统中通常使用 aplay 命令,它也是ALSA声音系统的一部分。aplay 的用法与 arecord 类似,但用于播放音频而不是录制。

以下是 aplay 的一些常见参数:

-D:指定播放设备的名称。

-t:指定文件类型,如 wav、raw 等。

-c:指定声道数,如 1 为单声道,2 为立体声。

-r:指定采样率,如 44100、48000 等。

-f:指定采样格式,如 S16_LE、S32_LE 等。

-d:指定播放的持续时间(秒)。

-q:安静模式,不输出任何播放信息。

-v:显示详细的播放信息。

输入aplay /tmp/record.wav指令,即可直接播放我们刚才所录制出的音频。

5

编写程序

从上面的步骤我们可以发现,在Linux系统中收音与放音都可以通过指令很方便地完成。但我们希望把录音与播放加入进应用的流程中,这就需要编写程序控制录音与放音的动作。所以我们编写程序进行录音与放音。我们使用mkdir指令新建一个文件夹,在里面使用touch指令创建一个audio.cpp文件,在文件内写入下面的程序代码。这个程序调用标准库system函数进行录音与播放。

#include <cstdlib> // for system()

int main() {
// 录制5秒钟的音频
int recordStatus = system("arecord -d 5 -f cd -t wav /tmp/recording.wav");
if (recordStatus != 0) {
// 如果arecord失败,输出错误消息并退出
return -1;
}

// 播放刚才录制的音频
int playStatus = system("aplay /tmp/recording.wav");
if (playStatus != 0) {
// 如果aplay失败,输出错误消息并退出
return -1;
}

return 0;
}



6

编译程序

退出编辑器,执行以下指令对程序进行编译。

g++ -o audio audio.cpp

7

运行结果

运行程序,打开程序即开始录音。5秒录音结束以后会自动播放。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载