如何深入探索嵌入式音频应用开发的奥秘?
摘要:liwen01 2023.12.10 前言 音频是声音的一种数字化表示方式,它的应用领域非常多,很多领域的应用技术已经很成熟,比如常见的:通信、娱乐、医疗(超声)、人机交互等等。就我目前接触到的消费类嵌入式设备而言,比较多的应用场景是: 语
liwen01 2023.12.10
前言
音频是声音的一种数字化表示方式,它的应用领域非常多,很多领域的应用技术已经很成熟,比如常见的:通信、娱乐、医疗(超声)、人机交互等等。就我目前接触到的消费类嵌入式设备而言,比较多的应用场景是:
语音对讲,
音视频录像
语音检测,识别
涉及到的开发技术主要有:
音频的编码、解码
音频格式封装、格式转换
回声消除
声音检测、识别
虽然音频的应用技术大部分都已经比较成熟了,但是在嵌入式开发中,受限于硬件资源的匮乏,还是会遇到不少的问题。其中涉及到很多的知识和概念,如果不是专业做音视频的同学,估计也容易弄迷糊。
下面内容是将我自己在实际开发工作中接触到的音频相关的知识进行了一个简单整理归纳,仅供参考。
(一)音频处理流程介绍
(1)理想处理流程
比较理想的音频应用处理流程,大概入下图所示:
MIC 将声音震动信号转换为电(数字/模拟)信号,将其输入到SOC的AI(音频输入模块)
AI模块对输入的信号进行转换(ADC转换采样),输出为PCM格式的音频数据
将PCM音频数据进行压缩、转换、封装成各种格式,比如常见的AAC、MP3等
将压缩过的音频文件,与视频文件一起封装成音视频文件,比如MP4文件
(2)实际处理流程
在嵌入式应用中,考虑到系统资源限制、应用场景的不同,实际使用会比较的复杂,主要的受限是:既要支持本地音频存储、又要支持网络传输。
PCM是原始音频数据,一般嵌入式芯片的音频编码是可以将PCM数据编码成G711、G726等格式,但基本上不会支持AAC编码,主要可能是涉及到版权问题。君正和海思系列的SOC都不能直接支持AAC编码。
但是从编码压缩比例来看,ACC编码的压缩比例是比G711、G726的要高的,也就是说在相同条件下,AAC编码可以存储时间更加长的音频信息。另外,很多视频封装库,对AAC的支持都是比较友好。
基于上面这些情况,就会导致在同一个体统中,可能会存在几种格式的音频格式数据。比如下图:
上图中,主要的应用场景,一个是音频网络传输,一个是音频本地存储。
路线1:
将AI模块采集到的PCM直接通过网络传输给IOT平台
这种方式耗费资源少,但是占用网络带宽大
适用于没有音频编码模块的SOC
路线2:
将PCM格式数据,编码成G711、G726等格式之后再通过网络传输出去
耗费资源少,网络带宽占用的也少,是最优的一个选项
适用于带音频编码的SOC
路线3:
将PCM格式数据,通过软件编码的方式编码成AAC格式,然后再封装成MP4、AVI等格式
这种方式会占用CPU资源,运行内存RAM,以及Flash空间(AAC编码库比较大)
适用于一定需要AAC编码的场景
路线4:
出现这种使用方式的主要原因是,SOC同一时间只支持一个音频格式输出,比如如果要输出PCM格式,就不能再编码输出G711、G726等格式
将编码输出的G711、G726格式,进行软件解码成PCM格式,在通过软件压缩成AAC格式,最后才封装成mp4格式
这种方式适用于一定要使用AAC格式,但是SOC又不能同时输出两种类型音频格式的场景
耗费的各种资源都是最多的
(二)音频格式转换
(1)PCM 与 G711A、G711U
PCM:
设备通过MIC采集音频信号,MIC分为两大类,数字MIC和模拟MIC,数字MIC输出的是已经转换过的数字信号,但消费类设备中比较常用的是模拟MIC。
PCM数据是将模拟MIC输入的模拟音频信号通过ADC转换为数字信号的二进制序列,它没有文件头也没有结束标志,是一种未压缩的数据格式。
