|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 名字好听吗 于 2022-6-8 10:08 编辑
! x: F; I( Y* l! \7 ^* S+ T+ W& d/ g; W" w3 ~$ B
本期内容将继续为大家介绍YoC组件,本文将通过阐述AV组件的框架、功能、使用示例等,带大家详细了解YoC的AV(多媒体)组件。
; o. x0 ?4 J9 P( }7 V4 B6 h& D# L& t# V
1、多媒体组件# S/ \1 ` v7 q2 S# T# t
libav是一个轻量级的多媒体组件,主要包含AV基础框架、播放器和音频服务三部分。其中AV框架采用典型的4层多媒体模型设计及面向对象的思想开发,使得用户在此基础上易于复用与扩展。
6 w, H+ H" \/ K. i- n Gav组件中内置了一个播放器的实现,可以播放wav、mp3、m4a、AMRnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等多种常见音频格式。同时基于播放器和YoC微服务架构实现了音频服务,支持提示音、语音合成(TTS)、音乐播放的状态切换与维护等功能,方便上层应用开发。用户可以分别基于音频服务、播放器和AV基础框架三个不同层次开发和扩展多媒体相关功能。
- [4 y U) z! D0 A9 f0 B+ z
" V! R- W+ g9 C) S: z! {; [
" |! O$ o% ~) y1 M
1.1 主要代码层次结构及说明
' b3 q( [/ h3 W; Z$ s├── aef:音效相关,当前包含sona音效算法(需商务合作)和核间音效(算法与播放器不在同一核上)
& h- P3 \1 G/ R* R3 O7 M# n/ H├── avcodec:AV框架中编解码相关,主要用于mp3、AAC、amr、flac等格式的解码/ x$ J0 u+ _" M# C: I+ ?
├── avfiLTEr:AV框架中定义一套过滤器机制。各filter串联,用于重采样、单双通道等处理
9 N5 G( E7 s9 G. p2 i├── avformat:AV框架中封装格式相关,主要用于mp3、m4a、wma等封装格式的demux处理
3 _+ I+ _; T+ B' S5 Z9 w8 i├── avutil:AV相关的通用函数实现等,如FIFO、url解析、http client等+ r) j+ W. ~7 |5 W9 r6 y- Q4 s5 }2 J
├── icore:相关核间算法的对接实现,包含核间解码、音效、重采样、fft实现等(针对多核运算场景)6 N1 w! p5 i% C2 V) u& B& [
├── include:av组件对外提供的头文件
( f) k9 r% x& C: I. `├── mca:mca加速器实现,包含IIR滤波器等功能(硬件相关) S0 Y! x* l/ B: Z8 V$ a- U
├── media:基于YoC微服务和播放器的音频服务的实现,支持语音合成、提示音等播放和状态切换
' r/ d+ }- n* y" U├── output:音视频输出实现,当前包含类似alsa接口的音频输出实现。用户可安装ao定义进行扩展6 u4 E5 @0 H+ g) w: b; g
├── player:播放器的实现,其依赖于AV框架中的各个层次的模块% L# f/ d3 w. C, m! n9 w" q1 r
├── stream:AV框架中媒体接入层实现,当前包含http、file、mem、fifo取流实现等
; R- c# f. ~. r* D├── swresample:包含单双通道转换、多种音频重采样(含本地/核间重采样)等功能实现
' A6 @7 m& l! V3 E└── tfft:傅里叶变换接口封装及实现等。用户可基于此切换使用本地/核间fft功能
. b2 k) }# A* h/ B2 K6 ~" T
' v( z2 `# r5 Z% y" V' c2、播放器/ F2 a! T$ L+ F
该播放器基于YoC平台轻量级的多媒体AV框架开发,具体实现包含在AV组件中。其主要有以下特点:
; e7 C+ m6 R/ ]: }轻量、极简音频播放器( A5 E8 `' z' G
MP3 解码: ROM < 35K, RAM < 20K! E S; x$ r6 h6 Z0 U* ]5 u
四层架构,按需裁剪&扩展
8 ]5 P3 {$ Y. W' d7 b) t9 v低时延,首播延时最低<20ms4 v& Y0 ~! F) y3 s2 w9 V
编解码DSP指令加速,充分利用硬件资源
$ I8 [5 Y% ]( N. h& w5 d支持本地/核间(跨核)解码
' U5 O3 t0 Q. |% T; o) v( o# s支持wav、mp3、m4a、amrnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等多种音频格式7 ~* t6 d. ~+ H2 J/ z0 E' l* G. m
支持sd卡、http(s)、fifo、mem、m3u8等多种取流方式$ H5 i1 Y& I7 U5 {' A
支持语音合成(TTS)播放# P, u1 `$ i! w. @5 z7 C
支持软件音量、音量曲线配置
- n8 }! w5 y3 w" C. f: i支持音频信息及当前播放时间获取" p8 v* o% ^' l# o+ _7 `
支持重采样输出% s o7 x% a1 s9 i; q
支持音效(Audio effector)、量化器(EQ)扩展及配置0 k' E# J% N- s
注意事项:1 X7 |0 H# y) O; @5 e9 h
播放器目前仅支持音频格式播放,若支持视频播放可基于AV框架扩展。
1 n3 z6 a3 Z8 X& q* e& C$ y& e; Z4 A! m) s
2.1 播放器的播放流程
" @4 Y/ B; h- \% ?0 ?* _& S用户创建播放器并调用player_play接口开始播放。该接口在初始化相关资源并创建播放线程抛出 _ptask任务。播放器将播放相关阻塞操作等放在 _ptask函数中处理。这样保证了player_play可以立即返回。
! e/ _1 I; o0 }: u: p为降低系统开销和简化播放器,系统将解复用、解码、音频输出等操作置于同一线程中处理。 _ptask函数初始时,调用 _player_prepare函数进行音频复用、编码格式的探测等功能,并判断播放器是否支持播放。! m0 W6 e$ Z* ~4 ? o5 q1 }; @
若支持播放,则在loop循环中不断调用解复用、解码、音频输出等功能。否则向上层上报播放失败事件退出本次播放。主要播放流程如下图所示:
" l. n8 a+ n1 m$ ^
: r' R" `; N' U- W) B, \
% {& ?7 K6 l* ?( y2.2 播放器的状态切换
9 w3 C7 u* g2 k' z播放器提供了一系列的调用接口,如player_pause、player_resume等接口来切换状态。几种状态间的转换关系如下图所示:5 Z( E4 x) g8 b A1 n
7 L7 ]) ?( G% P+ Y) L6 u
播放器通过调用player_play播放,初始时从停止态(PLAYER_STATUS_STOPED)进入到准备态(PLAYER_STATUS_PREPARING)。播放器内部通过调用_player_prepare函数来判断码流是否支持播放。
$ p0 f8 T3 u& {- l若准备ok则直接进入播放态(PLAYER_STATUS_RUNNING),否则上报播放错误事件进入到停止态。由于prepare阶段花费因网络等问题可能花费较多时间,在进入播放态之前,准备态和暂停态可正常进行切换。
( }- @2 b5 n4 V6 c8 L+ X. \正常播放后通过调用player_pause进入暂停态(PLAYER_STATUS_PAUSED)。在播放暂停时,通过调用player_resume恢复到播放态。通过调用player_stop可以从播放态和暂停态直接进入到停止态。$ \6 b4 \0 E, G5 I; C# x6 b4 D
7 p, o' Z1 J( Y+ X
3、AV框架8 }: q. E% w" T8 ^4 w
AV框架是一个轻量级的多媒体开发框架,其采用典型的4层多媒体模型设计及面向对象的思想开发,使得用户在此基础上易于复用与扩展。
+ e* H) u) k" i# U当前AV组件中提供了wav、mp3、m4a、amrnb、amrwb、flac、adts、opus、speex、adpcm_ms、alaw、mulaw等音频格式的支持。框架本身的设计向后提供视频支持。若有需要,可基于此AV框架进行扩展。
. E% H; G1 r8 W' @0 _: C6 F/ ?
+ O1 E( ^3 Y2 d: {1 D4 l3.1 AV框架分层设计' \5 p0 \) L' h+ B, i( z# F
AV框架主要抽象为四个层次:; ]: @5 o V8 l# w0 [1 W6 b4 Q
; U( w% O% k1 t: a9 e7 c, i
媒体接入层:access层,负责媒体数据的来源,可能是file、http、fifo、mem等
9 y$ Y6 @* Z1 `& ?/ s解复用层:demux层,负责把容器里的音视频数据剥离出来,然后分别送给audio/video decoder。3 L! X% Y' V2 ^ K+ o; b
解码层:decoder层,将解码完成后的数据(YUV、pcm)送给audio/video output输出。
- B- X& ?1 g( S2 c- [( b8 P输出层:output层,负责将decoder过来的数据呈现/播放出来。
8 o- }" N7 [ C' x' ~如果把数据想象成流水的话,每层的功能虽然不同,但是他们大致抽象的功能都是接收上个模块过来的数据,然后加工并把加工后的数据送到下一个模块。把上述这些层通过某种方式连接起来,就形成了一个音频播放器。
3 \0 H" H9 K9 D% @3 S( M( H f0 d7 @1 x" k
( V- C) n9 I. w0 s6 W) a- M |
|