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

news2024/11/20 10:44:30

0.前言

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

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

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

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

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

image-20230418094041344

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

img

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

选择 MIC1 输入

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

img

选择 MIC2 输入

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

img

开启 MIC1

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

img

开启 MIC2

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

img

设置 MIC1 音量

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

img

设置 MIC2 音量

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

img

开启 LINEOUT 输出功能

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

img

开启 LINEOUT 通路

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

img

设置输出音量

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

img

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

img

麦克风录音

在录音之前,首先需要使用 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

img

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

img

扬声器播放音频

在播放之前,首先需要打开音频通路,配置扬声器播放音频,具体可以参照 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

img

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 ratelimiting

root@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.wav
numid=23,iface=MIXER,name='MIC1 Input Select'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'differ'
  ; Item #1 'single'
  : values=0
numid=24,iface=MIXER,name='MIC2 Input Select'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'differ'
  ; Item #1 'single'
  : values=0
numid=17,iface=MIXER,name='MIC1 Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=18,iface=MIXER,name='MIC2 Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=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=0
numid=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=0
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo

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

root@TinaLinux:/# ls
bin       etc       lib       rdinit    run       sys       usr
data      home      mnt       rom       sbin      test.wav  var
dev       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.wav
numid=20,iface=MIXER,name='LINEOUT Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=20,iface=MIXER,name='LINEOUT Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=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=1

Playing 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.wav
numid=20,iface=MIXER,name='LINEOUT Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=20,iface=MIXER,name='LINEOUT Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=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=1

Playing 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# ls
S00mpp               S50telnet            rc.final
S01logging           S50usb               rc.modules
S03audio             S50wifidaemon        rc.preboot
S10udev              S99swupdate_autorun  rcK
S11dev               adbd                 rcS
S20urandom           cron                 sysntpd
S40network           dbus                 wpa_supplicant
S41netparam          dnsmasq
S50dbus              network

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

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

root@TinaLinux:/etc/init.d# cd /home/res/audio/
root@TinaLinux:/home/res/audio# ls
shutdown.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/au
dio/startup.wav
root@TinaLinux:/home/res/audio# sync

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBase分布式安装配置

本环节需要使用root用户完成相关配置&#xff0c;安装HBase需要配置前置环境。命令中要求使用绝对路径&#xff0c;具体要求如下: 确认是否完成Hadoop和Zookeeper的分布式&#xff08;Hadoop伪分布式不可以&#xff09;安装部署&#xff0c;没有的话请进行安装部署并启动。完成…

DeSD:用于3D医学图像分割的深度自蒸馏自监督学习

文章目录 DeSD: Self-Supervised Learning with Deep Self-Distillation for 3D Medical Image Segmentation摘要本文方法Deep Self-DistillationDownstream Transfer Learning 实验结果 DeSD: Self-Supervised Learning with Deep Self-Distillation for 3D Medical Image Seg…

数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)

目录 集合的表示 集合运算概述 并查集 树结构表示集合 集合运算 查找函数 并运算 集合的表示 集合运算概述 交、并、补、差&#xff0c;判定一个元素是否属于某一个集合 并查集 集合并、查某元素属于什么集合 我们最主要关心的就是集合的两个运算&#xff0c;一个是把…

【网络原理】TCP原理

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f343;一. 确认应答&#x1f342;二. 超时重传&#x1f341;三. 连接管理&#x1f33f;四. 滑动窗口&#x1f33b;五. 流量控制&#x1f340;六. 拥塞控制&#x1f49…

量子计算:当前阶段仍属于热炒概念

一、量子计算为何可能会成为一个风口&#xff1f; 量子计算是利用量子力学原理进行计算的新型计算方式。与传统的经典计算机不同&#xff0c;量子计算机利用量子比特&#xff08;qubits&#xff09;进行信息处理&#xff0c;由于量子比特可以处于叠加态&#xff0c;这使得量子…

【英】考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

携手共建数字钢铁,Hightopo亮相第三届钢铁展洽会

4 月 26 日备受期待的第三届钢铁展洽会在日照盛大召开。图扑软件作为智慧钢铁行业领先的 2D 和 3D 图形界面可视化解决方案提供商&#xff0c;受邀参与此次展会。 图扑软件携智慧钢铁三维可视化监控体系亮相“钢铁展洽会”&#xff0c;向众多钢铁企业展示了一系列图扑 HT 数字…

性价比最高的护眼台灯是哪款?最好的护眼台灯

不管你处在学生被动学习还是上班后主动学习的阶段&#xff0c;为自己挑选一款合适的台灯非常重要&#xff0c;因为夜晚的氛围能达到很高的学习效率&#xff0c;而台灯可以保证我们有一个舒适的阅读感受。那在为学习需求挑选台灯时&#xff0c;不应该以平价作为选购标准&#xf…

RTC 体验优化的“极值”度量与应用

随着线上互动需求的增加&#xff0c;直播连麦、语音/视频聊天的应用越来越广泛。我们一直在说“追求用户的极致体验”&#xff0c;但是体验是一个抽象的概念&#xff0c;很难量化和统计。如何从用户的行为中得到所在场景的优化“极值”&#xff0c;如何依据“极值”建立统一的质…

macOS Ventura 13.4 RC2(22F63)发布

系统介绍 根据黑果魏叔官网提供&#xff1a;5 月 12 日消息&#xff0c;苹果今天面向开发人员&#xff0c;发布了 macOS Ventura 13.4 的第 2 个候选 RC 版本&#xff08;内部版本号 22F63&#xff09;&#xff0c;距离上个候选版本相隔数天时间。 macOS Ventura 带来了台前调…

VS2022安装NuGet 包

手动安装 在 解决方案资源管理器 中加载项目&#xff0c;然后选择“项目>管理 NuGet 包”。系统会打开“NuGet 包管理器”窗口。 2、 选择“ 浏览 ”选项卡&#xff0c; 使用左上角的搜索框搜索特定包。 从列表中选择一个包&#xff0c;在右侧窗格中显示其信息&#xff0c;…

MySQL(表的约束)

文章目录 0. 前言1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 0. 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正…

【ChatGPTMidjourney】许多职业即将消失,AI 即将战胜人类了吗?

文章目录 前言一、人类科技发展史二、 AI浪潮下的挑战1. 数据安全和隐私保护问题2. 带来新的伦理和道德问题3. 版权和知识产权问题 三、对传统行业和就业的冲击1.传统文本编辑行业受到冲击2.就业岗位的变化3.工作流程的变化4.创意版权问题 四、AI浪潮下的机遇1.提高效率和创意性…

不用网闸、FTP的话 如何实现内外网数据交换?

网络隔离已然成为很多企业首选的数据保护方式&#xff0c;即使是内部人员之间&#xff0c;也是不能随意的发送敏感文件的。但是&#xff0c;文件的流转交互&#xff0c;又是不可避免的&#xff0c;网络隔离保障了企业网络安全&#xff0c;但在具体实践中仍需解决各隔离网间的数…

基于html+css图展示57

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Ubuntu一条命令下载MCU固件

现在很多项目开发都逐渐的迁移到Linux环境下。但是Linux开发单片机就没有像Windows下开发那么方便&#xff0c;它没有对应开发工具&#xff08;KEIL&#xff0c;IAR等&#xff09;&#xff0c;它们自带烧录等功能。所以在Linux上开发单片机需要安装下载固件的工具–JLink。 J…

小程序上线流程

1.配置服务器域名 小程序接口API 2.业务域名配置 ​首先配置小程序的业务域名&#xff0c;将下载txt文件放在A 域名根目录下&#xff0c;然后才可以配置业务域名为 A 。主要应用场景为&#xff0c;小程序页面跳转其他小程序 3. npm run build:weapp 编译&#xff0c;小程序代…

【ChatGPT】 AI 手把手一步一步教学 Self-Attention:这些动图和代码让你一次读懂ChatGPT背后的“自注意力”

BERT 及其多种变体已经在多种语言理解任务上取得了非常出色的表现,这些架构全都基于 Transformer,而 Transformer 又使用了一种名为「自注意力」的方法。本文将通过图示和代码对自注意力机制进行透彻的解读。当然,在阅读本文之前,你可能也想了解什么是注意力机制。没有问题…

【JS】js常用工具类:

文章目录 一、 将对象拼接到url地址后面二、正则获取url中的图片名称三、获取多数组之间的差集四、数组遍历判断是否需要拼接地址五、 数组去重六、如果值不存在就 push 进数组&#xff0c; 反之不处理七、过滤对象中为NaN&#xff0c;undefined的属性八、字符串中插入千位分隔…

基于SpringBoot+Vue的校园疫情防控系统(附源码和数据库)

文章目录 第一章2.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统功能模块5.2后台功能模块5.2.1管理员功能 源码咨询 第一章 springboot校园疫情防控系统演示录像2022 一个好的系统能将校园疫情防控的管理…