audio核心库的运行机制与技术要点

电子说

1.4w人已加入

描述

音频系统核心库的稳定运行,是实现低延迟、高保真音频体验的前提。其内部通过精密的线程调度、缓冲区管理与设备驱动交互,保障音频数据的连续性与同步性。本文将聚焦其运行机制,逐层拆解关键技术要点,帮助开发者洞察音频系统背后的工程智慧。


 

一、概述
 

audio 核心库 是指 LuatOS 通过对 es8311 或者 TM8211 编解码器进行配置以及传输,从而实现录音,播放音频,播放 TTS(文字转语音)功能,由于此核心库开发较早,历史包袱导致参数过多,使用非常不方便,建议使用 exaudio 扩展库。

重要概念解释:

1.1 硬件 DAC&ADC

也常称为 codec(编码器) ,decoder(解码器) 音频的编解码芯片,目前仅支持"es8311","TM8211",其中 es8311 支持 模拟音频转数据音频的输入,即为录音,也支持数据音频转为模拟音频的输出,即为播放。

1.2 采样率:

决定 “声音会不会漏了高频细节”(比如没抓住小鸟叫),采样率越高,细节越丰富,但是占用的空间也越大

1.3 位深:

决定 “声音的音量变化会不会生硬”(比如能不能分清小声说话和轻声咳嗽),使用 bit 表示,表示单次采样,模拟量使用数据量保存的位数,位数越高质量越高,占用空间越大

1.4 流式播放

一边传输音频数据,一边进行播放,适合一些对实时性要求较高的场景,或者需要对音频进行编码的场景

1.5 流式录音

一边录音,一边上传数据,适合对录音实时性要求较高或者需要对音频进行编码的场景。

1.6 es8311 和 TM8211 的区别

es8311 支持音频的编码和解码,即支持录音和播放,如果需要打电话,则需要使用 es8311

TM8211 仅支持音频的解码,即支持播放

es8311 相对于 TM8211 需要一路 I2C 作为信令的收发,因此电路上 TM8211 要更为简单.

780EHV 模块内部集成了 es8311,方便大家使用音频相关功能,并使用 GPIO20 控制 es8311 的使能;Air8000 以及 Air780 系列其他型号内部不含 es8311,需要外挂,

1.7 audio、exaudio、codec 三个库文件的区别和联系

audio、codec 是核心库,可以调用的最底层的代码,exaudio 是扩展库

audio 库和 exaudio 库都是实现了录音和播放,但是 exaudio 使用更加简单,去掉了历史原因造成的 audio 的冗余参数

codec 库 是实现了音频数据的编码和解码,不会对音频直接播放,audio 和 exaudio 可以对编解码后的音频进行播放

1.8 audio 核心库使用相关组合关系图

如图所示,audio 核心库大致可以分为如下几种组合关系,用户可根据所需功能自行搭配

音频系统

二、核心示例
 

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、由于 audio 核心库使用起来比较复杂,所以目前已经不推荐使用 audio 核心库,而是推荐使用 exaudio 扩展库来开发音频应用

4、此处仅仅简单地列举 audio 核心库中少数 api 的使用方法,供大家学习理解使用

音频系统

三、常量详解
 

这些常量用于 audio 库的各种配置和操作,在脚本代码中不需要声明,可直接调用。

3.1 音频格式常量

这些常量用于指定音频数据的格式:

audio.PCM

音频系统


 3.2 音频事件常量

这些常量用于 audio.on() 回调函数中的事件类型

audio.MORE_DATA

音频系统


 audio.DONE
 

音频系统


 audio.RECORD_DATA
 

音频系统


 audio.RECORD_DONE
 

音频系统


 3.3 休眠模式常量
 

这些常量用于 audio.pm() 函数的休眠模式

audio.RESUME

音频系统


 audio.STANDBY
 

音频系统


 audio.SHUTDOWN
 

音频系统


 audio.POWEROFF
 

音频系统


 四、函数详解


 4.1 配置相关

配置相关函数用于音频硬件配置、参数设置和事件注册。

audio.config(id, paPin, onLevel, dacDelay, paDelay, dacPin, dacLevel, dacTimeDelay)

功能

配置音频硬件参数。

参数

id

音频系统

paPin

音频系统

onLevel

音频系统

dacDelay

音频系统

paDelay

音频系统

dacPin

音频系统

dacLevel

音频系统


dacTimeDelay

音频系统

返回值

示例

音频系统


audio.setBus(id, bus_type, config_table)
 

功能

配置音频 DAC(编解码器)

参数

id

音频系统

bus_type

音频系统

config_table

音频系统

返回值
 

local result = audio.setBus(id, bus_type, config_table)

result

音频系统

例子

音频系统

audio.vol(id, value)
 

功能

设置播放音量

参数

id

音频系统

value

音频系统


返回值
 

local result = audio.vol(id, value)

result

音频系统


例子
 

音频系统


audio.micVol(id, value)
 

功能

设置 mic 音量

参数

id

音频系统


value

音频系统


返回值
 

local result = audio.micVol(id, value)

result

音频系统


例子
 

音频系统


audio.on(id, callback)
 

功能

注册音频事件回调函数

参数

id

音频系统


callback
 

音频系统


返回值
 

例子

音频系统


audio.pm(id,pm_mode)
 

功能

休眠控制(一般会自动调用 RESUME 模式)

参数

id

音频系统


pm_mode

音频系统


返回值
 

local result = audio.pm(id,pm_mode)

result

音频系统


例子

音频系统


4.2 检查相关

检查相关函数用于获取音频状态、错误信息和调试信息。

audio.getError(id)

功能

获取最近一次播放结果

参数

id

音频系统


返回值
 

local result = audio.getError(id)

result

音频系统

user_stop

音频系统

file_no

音频系统

例子

音频系统

audio.isEnd(id)
 

功能

检查音频通道是否播放结束

参数

id

音频系统


返回值
 

local result = audio.isEnd(id)

result

音频系统


例子

音频系统


audio.debug(on_off)
 

功能

配置调试信息输出

参数

on_off

音频系统


返回值
 

例子

音频系统


4.3 播放相关

播放相关函数,用于音频播放控制。

audio.play(id, path, errStop)

功能

播放音频文件或者停止播放(可以是文件或 TTS)

注意事项:

1、播放完成后,会回调一个 audio.DONE 消息

2、可以用 pause 来暂停或者恢复

3、audio.play(0) 即为停止播放,可以停止文件或 TTS

参数

id

音频系统


path

音频系统

errStop

音频系统


返回值
 

local result = audio.play(id, path, errStop)

result

音频系统


例子

音频系统


audio.pause(id, pause)
 

功能

暂停或恢复播放

参数

id

音频系统


pause

音频系统


返回值
 

local result = audio.pause(id, pause)

result

音频系统

例子

音频系统


audio.playStop(id)
 

功能

停止播放音频文件,等同于 audio.play(id)

参数

id

音频系统


返回值
 

local result = audio.playStop(id)

result

音频系统


例子

音频系统


audio.tts(id, text)
 

功能

播放或暂停播放 TTS 文本转语音

参数

id

音频系统

text

音频系统


返回值
 

local result = audio.tts(id, text)

result

音频系统


例子

音频系统


audio.start(id, audio_format, num_channels, sample_rate, bits_per_sample, is_signed)
 

功能

启动一个音频通道,仅用于流式播放。

参数

id

音频系统


audio_format

音频系统


num_channels

音频系统


sample_rate

音频系统


bits_per_sample

音频系统


is_signed

音频系统


返回值
 

local result = audio.start(id, audio_format, num_channels, sample_rate, bits_per_sample, is_signed)

result

音频系统


示例

音频系统


audio.write(id, data)
 

功能

向音频通道中写入音频数据,用于播放

参数

id

音频系统

data

音频系统


返回值
 

local result = audio.write(id, data)

result

音频系统


示例

音频系统


audio.finish(id)
 

功能

写入最后一块数据后,通知多媒体通道已经没有更多数据需要播放了

参数

id

音频系统


返回值
 

local result = audio.finish(id)

result

音频系统

示例

音频系统


audio.stop(id)
 

功能

停止指定的多媒体通道

参数

id

音频系统


返回值
 

local result = audio.stop(id)

result

音频系统


示例

音频系统


audio.record(id, record_type, record_time, amr_quailty, path, nil, buff0, buff1,channelCount)
 

功能

录音

参数

id

音频系统


record_type
 

音频系统


record_time

音频系统


amr_quailty

音频系统


path

音频系统


reserved

音频系统


buff0

音频系统


buff1

音频系统


返回值
 

local result = audio.record(id, record_type, record_time, amr_quailty, path, nil, buff0, buff1,channelCount)

result

音频系统


 示例 1: 录制到文件
 

音频系统


 示例 2: 流式录音

音频系统


audio.recordStop(id)
 

功能

停止录音

注意:audio 的回调函数返回 audio.RECORD_DONE 的 event 才是真正的结束

参数

id

音频系统


返回值
 

local result = audio.recordStop(id)

result

音频系统


示例

音频系统


 

五、模组支持说明
 

780EHM,780EHV,780EGH,780EGG,以及 8000 全系列均支持;

780EPM,780EGP,700ECP 不支持。

724,722,720,820,795 也不支持。

今天的内容就分享到这里了~

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分