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 核心库大致可以分为如下几种组合关系,用户可根据所需功能自行搭配

audio

二、核心示例
 

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

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

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

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

audio

三、常量详解
 

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

3.1 音频格式常量

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

audio.PCM

audio


 3.2 音频事件常量

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

audio.MORE_DATA

audio


 audio.DONE
 

audio


 audio.RECORD_DATA
 

audio


 audio.RECORD_DONE
 

audio


 3.3 休眠模式常量
 

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

audio.RESUME

audio


 audio.STANDBY
 

audio


 audio.SHUTDOWN
 

audio


 audio.POWEROFF
 

audio


 四、函数详解


 4.1 配置相关

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

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

功能

配置音频硬件参数。

参数

id

audio

paPin

audio

onLevel

audio

dacDelay

audio

paDelay

audio

dacPin

audio

dacLevel

audio


dacTimeDelay

audio

返回值

示例

audio


audio.setBus(id, bus_type, config_table)
 

功能

配置音频 DAC(编解码器)

参数

id

audio

bus_type

audio

config_table

audio

返回值
 

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

result

audio

例子

audio

audio.vol(id, value)
 

功能

设置播放音量

参数

id

audio

value

audio


返回值
 

local result = audio.vol(id, value)

result

audio


例子
 

audio


audio.micVol(id, value)
 

功能

设置 mic 音量

参数

id

audio


value

audio


返回值
 

local result = audio.micVol(id, value)

result

audio


例子
 

audio


audio.on(id, callback)
 

功能

注册音频事件回调函数

参数

id

audio


callback
 

audio


返回值
 

例子

audio


audio.pm(id,pm_mode)
 

功能

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

参数

id

audio


pm_mode

audio


返回值
 

local result = audio.pm(id,pm_mode)

result

audio


例子

audio


4.2 检查相关

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

audio.getError(id)

功能

获取最近一次播放结果

参数

id

audio


返回值
 

local result = audio.getError(id)

result

audio

user_stop

audio

file_no

audio

例子

audio

audio.isEnd(id)
 

功能

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

参数

id

audio


返回值
 

local result = audio.isEnd(id)

result

audio


例子

audio


audio.debug(on_off)
 

功能

配置调试信息输出

参数

on_off

audio


返回值
 

例子

audio


4.3 播放相关

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

audio.play(id, path, errStop)

功能

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

注意事项:

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

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

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

参数

id

audio


path

audio

errStop

audio


返回值
 

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

result

audio


例子

audio


audio.pause(id, pause)
 

功能

暂停或恢复播放

参数

id

audio


pause

audio


返回值
 

local result = audio.pause(id, pause)

result

audio

例子

audio


audio.playStop(id)
 

功能

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

参数

id

audio


返回值
 

local result = audio.playStop(id)

result

audio


例子

audio


audio.tts(id, text)
 

功能

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

参数

id

audio

text

audio


返回值
 

local result = audio.tts(id, text)

result

audio


例子

audio


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

功能

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

参数

id

audio


audio_format

audio


num_channels

audio


sample_rate

audio


bits_per_sample

audio


is_signed

audio


返回值
 

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

result

audio


示例

audio


audio.write(id, data)
 

功能

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

参数

id

audio

data

audio


返回值
 

local result = audio.write(id, data)

result

audio


示例

audio


audio.finish(id)
 

功能

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

参数

id

audio


返回值
 

local result = audio.finish(id)

result

audio

示例

audio


audio.stop(id)
 

功能

停止指定的多媒体通道

参数

id

audio


返回值
 

local result = audio.stop(id)

result

audio


示例

audio


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

功能

录音

参数

id

audio


record_type
 

audio


record_time

audio


amr_quailty

audio


path

audio


reserved

audio


buff0

audio


buff1

audio


返回值
 

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

result

audio


 示例 1: 录制到文件
 

audio


 示例 2: 流式录音

audio


audio.recordStop(id)
 

功能

停止录音

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

参数

id

audio


返回值
 

local result = audio.recordStop(id)

result

audio


示例

audio


 

五、模组支持说明
 

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

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

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

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

审核编辑 黄宇

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

全部0条评论

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

×
20
完善资料,
赚取积分