|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 名字好听吗 于 2022-6-8 10:08 编辑 5 A1 L# p( }( K: s; B3 s, u1 T- `
& X" ]% k; J) O2 P% g. m5 @本期内容将继续为大家介绍YoC组件,本文将通过阐述AV组件的框架、功能、使用示例等,带大家详细了解YoC的AV(多媒体)组件。
/ ?7 X- h, q! G/ n$ q( H* h8 _2 |5 {# p8 C6 ?/ G
1、多媒体组件+ z- _& @, _4 Z5 |
libav是一个轻量级的多媒体组件,主要包含AV基础框架、播放器和音频服务三部分。其中AV框架采用典型的4层多媒体模型设计及面向对象的思想开发,使得用户在此基础上易于复用与扩展。
2 h) z$ V5 I- [6 C9 u- m( Fav组件中内置了一个播放器的实现,可以播放wav、mp3、m4a、AMRnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等多种常见音频格式。同时基于播放器和YoC微服务架构实现了音频服务,支持提示音、语音合成(TTS)、音乐播放的状态切换与维护等功能,方便上层应用开发。用户可以分别基于音频服务、播放器和AV基础框架三个不同层次开发和扩展多媒体相关功能。
, g- k% S7 R( A* H* @" f
8 X4 T! H- H! P: D
* r/ R D1 n+ A% p% ~$ N1.1 主要代码层次结构及说明
# p. m. l" K! W8 I+ c. q├── aef:音效相关,当前包含sona音效算法(需商务合作)和核间音效(算法与播放器不在同一核上)
" j% c2 C4 q& n├── avcodec:AV框架中编解码相关,主要用于mp3、AAC、amr、flac等格式的解码
+ J0 J' R* X6 |. g; e+ x$ J├── avfiLTEr:AV框架中定义一套过滤器机制。各filter串联,用于重采样、单双通道等处理
# z+ g; O/ ?6 j' {├── avformat:AV框架中封装格式相关,主要用于mp3、m4a、wma等封装格式的demux处理
$ k3 M/ `) P8 l├── avutil:AV相关的通用函数实现等,如FIFO、url解析、http client等( _' e- l5 \' S m6 F
├── icore:相关核间算法的对接实现,包含核间解码、音效、重采样、fft实现等(针对多核运算场景)
9 e) P( w# }& E. j3 @2 A├── include:av组件对外提供的头文件
! a! b8 Q1 p( T4 s├── mca:mca加速器实现,包含IIR滤波器等功能(硬件相关)
1 S% S1 S1 r4 j+ R/ D├── media:基于YoC微服务和播放器的音频服务的实现,支持语音合成、提示音等播放和状态切换2 a' z- L4 v: h( W5 J! p
├── output:音视频输出实现,当前包含类似alsa接口的音频输出实现。用户可安装ao定义进行扩展
k* [' B/ A' {8 o0 p) f├── player:播放器的实现,其依赖于AV框架中的各个层次的模块! @8 Y+ \: X4 g$ w6 |$ T
├── stream:AV框架中媒体接入层实现,当前包含http、file、mem、fifo取流实现等
9 a; C# Q+ k. P; f% R├── swresample:包含单双通道转换、多种音频重采样(含本地/核间重采样)等功能实现! ^. ^3 r: X1 K+ f* Q
└── tfft:傅里叶变换接口封装及实现等。用户可基于此切换使用本地/核间fft功能
# h$ N; o! e% x" F/ v/ Z6 Z5 W/ ]
3 T6 t& G8 O, h+ `' C5 B4 @2、播放器
1 i# P& v/ V# z该播放器基于YoC平台轻量级的多媒体AV框架开发,具体实现包含在AV组件中。其主要有以下特点:
7 I8 Z7 R$ `4 k. A7 e! {% n轻量、极简音频播放器. Y% A& T, E/ P, B
MP3 解码: ROM < 35K, RAM < 20K
. V3 }/ B- T" F) V6 j1 i四层架构,按需裁剪&扩展
# e* y* |* a7 r! U: ?低时延,首播延时最低<20ms
$ t: F* O+ D/ f( H a0 \6 N5 E1 H/ ^编解码DSP指令加速,充分利用硬件资源) M) j e: h: s7 S/ Z0 O
支持本地/核间(跨核)解码
7 E- w& i6 e: v# x支持wav、mp3、m4a、amrnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等多种音频格式
0 n, f9 E$ g! G9 [3 P2 h支持sd卡、http(s)、fifo、mem、m3u8等多种取流方式
3 \( W M% ?8 _- O j支持语音合成(TTS)播放
6 b# I, Y$ I+ R) o! ~8 |支持软件音量、音量曲线配置
& \2 N, o$ ]: l支持音频信息及当前播放时间获取* `$ G$ B# h7 r8 g/ M5 n
支持重采样输出
3 n; f5 S5 J/ m0 f) M2 b& Y支持音效(Audio effector)、量化器(EQ)扩展及配置
( y" d# N. O7 t. q4 B1 ^* u& O& p% J注意事项:( Q J8 Z/ C* `9 X8 k& v
播放器目前仅支持音频格式播放,若支持视频播放可基于AV框架扩展。
5 B# z5 {; b$ k1 m
- Y5 C1 H- F& S1 d _2.1 播放器的播放流程% v& U( W/ A' x. l
用户创建播放器并调用player_play接口开始播放。该接口在初始化相关资源并创建播放线程抛出 _ptask任务。播放器将播放相关阻塞操作等放在 _ptask函数中处理。这样保证了player_play可以立即返回。
% Z- b" n' q; A1 h- c$ D) z# \7 x为降低系统开销和简化播放器,系统将解复用、解码、音频输出等操作置于同一线程中处理。 _ptask函数初始时,调用 _player_prepare函数进行音频复用、编码格式的探测等功能,并判断播放器是否支持播放。
: q% Z( F1 l, h* v% A3 a/ K若支持播放,则在loop循环中不断调用解复用、解码、音频输出等功能。否则向上层上报播放失败事件退出本次播放。主要播放流程如下图所示:; T0 N- z& s5 z7 L* v: O; D
- n. W0 |0 Y+ ` a$ l
# p5 A2 Y' H9 z. Y& r& e/ E3 N% y2 P2.2 播放器的状态切换
# |' n3 T; N6 ?: x0 y播放器提供了一系列的调用接口,如player_pause、player_resume等接口来切换状态。几种状态间的转换关系如下图所示: a, p6 u- s: Y
1 F% ?# s7 ]$ W. Q* M
播放器通过调用player_play播放,初始时从停止态(PLAYER_STATUS_STOPED)进入到准备态(PLAYER_STATUS_PREPARING)。播放器内部通过调用_player_prepare函数来判断码流是否支持播放。* i+ q0 @; Q' u. ^4 \8 k. [( F8 P
若准备ok则直接进入播放态(PLAYER_STATUS_RUNNING),否则上报播放错误事件进入到停止态。由于prepare阶段花费因网络等问题可能花费较多时间,在进入播放态之前,准备态和暂停态可正常进行切换。
! ?/ G6 v3 m( P1 Y7 C2 M. x- h) Q4 \正常播放后通过调用player_pause进入暂停态(PLAYER_STATUS_PAUSED)。在播放暂停时,通过调用player_resume恢复到播放态。通过调用player_stop可以从播放态和暂停态直接进入到停止态。
4 `9 P) F$ m, [" s0 Z9 G7 J% a6 V) m* }2 s# D9 Z& s& v
3、AV框架' y- o6 L6 M7 o# c3 r- n
AV框架是一个轻量级的多媒体开发框架,其采用典型的4层多媒体模型设计及面向对象的思想开发,使得用户在此基础上易于复用与扩展。
( t- I5 V' y5 z' F5 q当前AV组件中提供了wav、mp3、m4a、amrnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等音频格式的支持。框架本身的设计向后提供视频支持。若有需要,可基于此AV框架进行扩展。( ~1 C$ K" |' Q! _) Y( i
* o! s4 D8 h- [+ `% M9 f% P3.1 AV框架分层设计
& z% ~5 w: {2 {2 z3 ]# p. D; d1 f/ WAV框架主要抽象为四个层次:3 D- P1 i( q( ]+ s2 g
" G: {& O* L& _- @1 k媒体接入层:access层,负责媒体数据的来源,可能是file、http、fifo、mem等8 q$ W3 e2 H L( l9 q) ^
解复用层:demux层,负责把容器里的音视频数据剥离出来,然后分别送给audio/video decoder。: }' r9 j( @6 u k7 j
解码层:decoder层,将解码完成后的数据(YUV、pcm)送给audio/video output输出。; _9 t/ z# S6 }3 t
输出层:output层,负责将decoder过来的数据呈现/播放出来。3 q2 y0 F% }: k h5 z' B! ?4 Y+ l
如果把数据想象成流水的话,每层的功能虽然不同,但是他们大致抽象的功能都是接收上个模块过来的数据,然后加工并把加工后的数据送到下一个模块。把上述这些层通过某种方式连接起来,就形成了一个音频播放器。
4 z# }3 w5 |% w$ n) V! ?" C2 N- O6 A/ y
X, I% Z8 W; K& I
|
|