主页 > 互联网 > 内容页

热头条丨10. 100ASK_V853-PRO开发板支持录音和播放音频

2023-05-12 11:18:14 来源:嵌入式Linux那些事

0.前言

​ 本章主要讲述如何使用板载的MIC拾音咪头录音并使用喇叭播放音频。

​ 音频_开发指南:https://tina.100ask.net/SdkModule/Linux_AudioFrequency_DevelopmentGuide-02/#220-v853


(资料图片)

​ 全志官方音频介绍:https://v853.docs.aw-ol.com/soft/tina_audio/#audio_1100ASK_V853-PRO开发板资料汇总:

链接:100ASK_100ASK-PRO 资料汇总 - Allwinner / V853-Pro - 嵌入式开发问答社区

100ASK_V853-PRO开发板购买链接:100ASK_V853-PRO开发板

1.硬件介绍

​ V853 芯片提供了 AudioCodec(芯片内置音频接口) x1、I2S/PCM(数字音频接口) x2、DMIC(外置数字 MIC 接口) x1,可以满足各类音频需求。100ASK_V853-PRO开发板板载两个MIC拾音咪头和喇叭接口。如下图所示:

如果您想要使用喇叭接口播放声音,需要外接一个喇叭

2.音频驱动框架使用

Tina Linux中使用的是标准的 ALSA API,所以使用音频的功能可以使用标准的 alsa-utils。它提供了 amixeraplayarecord等工具。在Tina根目录下输入make menuconfig

book@100ask:~/workspaces/tina-v853-open$ make menuconfig

进入Tina配置界面后,进入如下目录

> Sound <*> alsa-utils............ ALSA (Advanced Linux Sound Architecture) utilities

如下图所示:

选中完成后会启用amixeraplayarecord功能,重新编译打包更新系统即可体验。

2.1 驱动调控:amixer

amixer是命令行的 ALSA 声卡驱动调节工具,用于启用、关闭各声卡,设置各声卡的音量。使用 amixer命令列出当前注册的音频设备。

amixer
常用选项
选项             功能-D,--device    指定声卡设备,默认使用default
常用命令
命令            功能controls       列出指定声卡的所有控件contents       列出指定声卡的所有控件的具体信息cget           获取指定控件的信息cset           设定指定控件的值

选择 MIC1 输入

amixer -D hw:audiocodec cset name="MIC1 Input Select" 0

选择 MIC2 输入

amixer -D hw:audiocodec cset name="MIC2 Input Select" 0

开启 MIC1

amixer -D hw:audiocodec cset name="MIC1 Switch" 1

开启 MIC2

amixer -D hw:audiocodec cset name="MIC2 Switch" 1

设置 MIC1 音量

amixer -D hw:audiocodec cset name="MIC1 gain volume" 30

设置 MIC2 音量

amixer -D hw:audiocodec cset name="MIC2 gain volume" 30

开启 LINEOUT 输出功能

amixer -D hw:audiocodec cset name="LINEOUT Output Select" 1

开启 LINEOUT 通路

amixer -D hw:audiocodec cset name="LINEOUT Switch" 1

设置输出音量

amixer -D hw:audiocodec cset name="LINEOUT volume" 25

2.2 录音工具:arecord

arecord 是命令行的 ALSA 声卡驱动的录音工具,用于录音功能。

选项                功能-D,--device       指定声卡设备,默认使用default-l,--list-device` 列出当前所有声卡-t,--file-type    指定播放文件的格式,如voc,wav,raw,不指定的情况下会去读取文件头部作识别-c,--channels     指定通道数-f,--format       指定采样格式-r,--rate         采样率-d,--duration     指定播放的时间--period-size     指定period size--buffer-siz`     指定buffer size

查看录音设备

可以使用 arecord -l命令查看开发板提供的录音设备。

arecord -l

麦克风录音

在录音之前,首先需要使用 amixer 打开音频通路,配置内部 MIC1,MIC2 录制双通道音频。

amixer -D hw:audiocodec cset name="MIC1 Input Select" 0 &&     amixer -D hw:audiocodec cset name="MIC2 Input Select" 0 &&     amixer -D hw:audiocodec cset name="MIC1 Switch" 1 &&     amixer -D hw:audiocodec cset name="MIC2 Switch" 1 &&     amixer -D hw:audiocodec cset name="MIC1 gain volume" 30 &&     amixer -D hw:audiocodec cset name="MIC2 gain volume" 30

使用 arecord命令,使用板载的两个麦克风进行录音。

arecord -D hw:audiocodec -f S16_LE -t wav -c2 -r 16000 -d 3 t.wav

2.3 播放工具:aplay

aplay 是命令行的 ALSA 声卡驱动的播放工具,用于播放功能。

选项                功能-D,--device       指定声卡设备,默认使用default-l,--list-devices 列出当前所有声卡-t,--file-type    指定播放文件的格式,如voc,wav,raw,不指定的情况下会去读取文件头部作识别-c,--channels     指定通道数-f,--format       指定采样格式-r,--rate         采样率-d,--duration     指定播放的时间--period-size     指定period size--buffer-size     指定buffer size

查看播放设备

使用 aplay -l查看播放设备

aplay -l

扬声器播放音频

在播放之前,首先需要打开音频通路,配置扬声器播放音频,具体可以参照 amixer 配置。

amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT volume" 25

使用 aplay通过外接扬声器播放刚才录制的音频。

aplay -D hw:audiocodec t.wav

3.测试录音功能

​ 启动开发板后,在串口终端输入如下命令:

amixer -D hw:audiocodec cset name="MIC1 Input Select" 0 &&    amixer -D hw:audiocodec cset name="MIC2 Input Select" 0 &&     amixer -D hw:audiocodec cset name="MIC1 Switch" 1 &&     amixer -D hw:audiocodec cset name="MIC2 Switch" 1 &&     amixer -D hw:audiocodec cset name="MIC1 gain volume" 30 &&     amixer -D hw:audiocodec cset name="MIC2 gain volume" 30 &&     arecord -D hw:audiocodec -f S16_LE -t wav -c2 -r 16000 -d 3 test.wav

例如:

root@TinaLinux:/# [   67.295067] random: crng init done[   67.298885] random: 4 urandom warning(s) missed due to ratelimitingroot@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# amixer -D hw:audiocodec cset name="MIC1 Input Select" 0 && >    amixer -D hw:audiocodec cset name="MIC2 Input Select" 0 && >     amixer -D hw:audiocodec cset name="MIC1 Switch" 1 && >     amixer -D hw:audiocodec cset name="MIC2 Switch" 1 && >     amixer -D hw:audiocodec cset name="MIC1 gain volume" 30 && >     amixer -D hw:audiocodec cset name="MIC2 gain volume" 30 && >     arecord -D hw:audiocodec -f S16_LE -t wav -c2 -r 16000 -d 3 test.wavnumid=23,iface=MIXER,name="MIC1 Input Select"  ; type=ENUMERATED,access=rw------,values=1,items=2  ; Item #0 "differ"  ; Item #1 "single"  : values=0numid=24,iface=MIXER,name="MIC2 Input Select"  ; type=ENUMERATED,access=rw------,values=1,items=2  ; Item #0 "differ"  ; Item #1 "single"  : values=0numid=17,iface=MIXER,name="MIC1 Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=18,iface=MIXER,name="MIC2 Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=12,iface=MIXER,name="MIC1 gain volume"  ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0  : values=30  | dBscale-min=0.00dB,step=1.00dB,mute=0numid=13,iface=MIXER,name="MIC2 gain volume"  ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0  : values=30  | dBscale-min=0.00dB,step=1.00dB,mute=0Recording WAVE "test.wav" : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo

程序会自动录音并保存文件到当前目录下,查看当前目录可以看到保存的文件test.wav

root@TinaLinux:/# lsbin       etc       lib       rdinit    run       sys       usrdata      home      mnt       romsbin      test.wav  vardev       init      proc      root      squashfs  tmp       www

4.播放音频

在串口终端下,输入以下命令,可以播放刚刚我们录制的音频

amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT volume" 31 &&     aplay -D hw:audiocodec test.wav

例如:

root@TinaLinux:/# amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 && >     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 && >     amixer -D hw:audiocodec cset name="LINEOUT volume" 31 && >     aplay -D hw:audiocodec test.wavnumid=20,iface=MIXER,name="LINEOUT Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=20,iface=MIXER,name="LINEOUT Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=16,iface=MIXER,name="LINEOUT volume"  ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0  : values=31  | dBrange-    rangemin=0,,rangemax=1      | dBscale-min=0.00dB,step=0.00dB,mute=1    rangemin=2,,rangemax=31      | dBscale-min=-43.50dB,step=1.50dB,mute=1Playing WAVE "test.wav" : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo

​ 此时如果我们接上了喇叭,喇叭就会播放刚刚录制的音频。

​ 同样我们也可以将音频文件拷贝到开发板中,使用以下命令

amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT volume" 31 &&     aplay -D hw:audiocodec test.wav

其中test.wav更换为您想要播放的音频文件的路径名称。

假设提前要播放的音频文件拷贝到TF卡中,插入TF卡后,挂载TF卡

root@TinaLinux:/# mount /dev/mmcblk1p1 /mnt/extsd/

查看TF卡中testSound文件夹下的测试音频文件

root@TinaLinux:/# ls /mnt/extsd/testSound/test100.wav

使用如下命令播放测试音频

amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 &&     amixer -D hw:audiocodec cset name="LINEOUT volume" 31 &&     aplay -D hw:audiocodec /mnt/extsd/testSound/test100.wav

例如:

root@TinaLinux:/# amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 && >     amixer -D hw:audiocodec cset name="LINEOUT Switch" 1 && >     amixer -D hw:audiocodec cset name="LINEOUT volume" 31 && >     aplay -D hw:audiocodec /mnt/extsd/testSound/test100.wavnumid=20,iface=MIXER,name="LINEOUT Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=20,iface=MIXER,name="LINEOUT Switch"  ; type=BOOLEAN,access=rw------,values=1  : values=onnumid=16,iface=MIXER,name="LINEOUT volume"  ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0  : values=31  | dBrange-    rangemin=0,,rangemax=1      | dBscale-min=0.00dB,step=0.00dB,mute=1    rangemin=2,,rangemax=31      | dBscale-min=-43.50dB,step=1.50dB,mute=1Playing WAVE "/mnt/extsd/testSound/test100.wav" : Signed 16 bit Little Endian, Rate 22050 Hz, Stereo

此时喇叭就会播放测试音频。

5.更换开机音乐

由于100ASK_V853-PRO开发板已经默认启用了开机音乐,自启脚本位于:

openwrt/target/v853/v853-vision/busybox-init-base-files/etc/init.d/S03audio

我们可以在开发板的串口终端的/etc/init.d/目录下找到S03audio文件

root@TinaLinux:/# cd /etc/init.d/root@TinaLinux:/etc/init.d# lsS00mpp               S50telnet            rc.finalS01logging           S50usbrc.modulesS03audio             S50wifidaemon        rc.prebootS10udev              S99swupdate_autorun  rcKS11dev               adbd                 rcSS20urandom           cron                 sysntpdS40network           dbus                 wpa_supplicantS41netparamdnsmasqS50dbus              network

可以查看相关的脚本源码。

进入/home/res/audio/目录下,可以查看两个文件,分别为开机音乐startup.wav和关机音乐shutdown.wav

root@TinaLinux:/etc/init.d# cd /home/res/audio/root@TinaLinux:/home/res/audio# lsshutdown.wav  startup.wav

我们可以通过更换startup.wav文件,来达到更换开机音乐的效果。假设我将TF卡中的test100.wav拷贝到/home/res/audio/目录下,并更换名称为startup.wav

root@TinaLinux:/home/res/audio# cp /mnt/extsd/testSound/test100.wav /home/res/audio/startup.wavroot@TinaLinux:/home/res/audio# sync

输入reboot,重启后即可通过喇叭听到更换后的开机音乐。

标签:

上一篇:9.100ASK_V853-PRO开发板支持E907小核开发
下一篇:最后一页