基于YoC的轻量级AV框架设计

简介: 简介AV框架是一个轻量级的多媒体开发框架。其采用典型的4层多媒体模型设计及面向对象的思想开发,使得用户在此基础上易于复用与扩展。当前AV组件中提供了wav、mp3、m4a、amrnb、amrwb、flac、adts等音频格式的支持。框架本身的设计向后提供视频支持。若有视频播放的需要,可基于此AV框架进行扩展。

AV框架分层设计
AV框架主要抽象为四个层次:image.png
媒体接入层: access层,负责媒体数据的来源,可能是file、http、fifo、mem等。

解复用层: demux层,负责把容器里的音视频数据剥离出来,然后分别送给audio/video decoder。

解码层: decoder层,将解码完成后的数据(yuv、pcm)送给audio/video output输出。

输出层: output层,负责将decoder过来的数据呈现/播放出来。

如果把数据想象成流水的话,每层的功能虽然不同,但是他们大致抽象的功能都是接收上个模块过来的数据,然后加工并把加工后的数据送到下一个模块。把上述这些层通过某种方式连接起来,就形成了一个音频播放器。

媒体接入层(stream)
UML设计如下图所示:image.png
stream_ops_http、stream_ops_mem、stream_ops_file、stream_ops_fifo分别对应于网络流、内存流、本地文件流、fifo流取流播放。
其中语音合成(TTS)流的播放可基于stream_ops_fifo实现。
后续对于新增的媒体接入类型,可根据struct stream_ops结构中定义的类型,实现对应的接口即可扩展。
媒体接入层中各种流类型的url格式定义规则如下表所示:
流类型 URL前缀 URL格式
网络流 http(s):// http(s)://ip:port/xx.mp3
文件流(SD卡) file:// file:///fatfs0/xx.mp3?avformat=%s&avcodec=%u&channel=%u&rate=%u
内存流 mem:// mem://addr=%u&size=%u&avformat=%u&avcodec=%u&channel=%u&rate=%u
fifo流 fifo:// fifo://tts/1?avformat=%s&avcodec=%u&channel=%u&rate=%u
对于能够探测到媒体信息的码流,url格式中的avformat、avcodec、channel、rate字段不是必须的。
这些配置项一般用于raw pcm的播放(通过这些参数传入裸流的具体格式)。
avformat字段可选有rawaudio/wav/mp3/m4a。
avcodec字段可选有pcm_s16be/pcm_s32be/pcm_s16le/pcm_s32le/pcm_s8/pcm_u16be/pcm_u32be/pcm_u16le/pcm_u32le/pcm_u8。

url格式具体示例如下表所示:
流类型 示例

文件流(SD卡) file:///fatfs0/test.MP3
内存流 mem://addr=765432&size=1024&avformat=rawaudio&avcodec=pcm_s16le &channel=1&rate=16000
fifo流 fifo://tts/1

解复用层(avformat)
UML设计如下图所示:image.png
其中demux_ops_wav、demux_ops_mp3、demux_ops_m4a分别对应于wav、mp3、m4a音频复用格式解复用。解复用出来的一帧音频数据会被送到对应的解码器进行解码。
当前支持wav、mp3、mp4、adts、flac、asf、amr等格式的解复用
后续对于新增的解复用格式,可根据struct demux_ops结构中定义的类型,实现对应的接口即可扩展

解码层(avcodec)
该层将demux解复用后出来的一帧帧编码数据解码成音视频裸数据(pcm/yuv)。
在某些情况下,某些编码类型解码时可能占用很高的主频(如在ck803ef上,HE-AAC解码主频需求在240M左右),此时可能需要通过核间通信(mailbox/IPC)将解码工作放到另一核上执行。
解码层为考虑扩展性,支持本地(核内)与跨核(核间)解码。其中核间解码适配层请参考av/avcodec/ad_ipc.c使用。
核间解码结构如下图所示:image.png
核间解码时序图如下所示:image.png
核内/核间解码框架设计如下图所示:image.png
解码器UML设计如下图所示:image.png
其中ad_ops_pvmp3、ad_ops_rawaudio、ad_ops_opus、ad_ops_fdk分别对应于mp3、裸pcm(解码透传)、opus、aac音频编码格式解码
当前支持mp3、aac、adpcm_ms、flac、amrnb、amrwb等格式的解码
后续对于新增的解码类型,可根据struct ad_ops结构中定义的类型,实现对应的接口即可扩展

输出层(output)
UML设计如下图所示:image.png

其中ao_ops_alsa对应于采用alsa标准音频输出接口实现。通过alsa层来屏蔽各产品不同codec的实现
后续对于新增的输出类型,可根据struct ao_ops结构中定义的类型或在alsa/sound驱动层,实现对应的接口即可扩展
音频输出链路如下图所示:image.png

相关文章
|
NoSQL Linux MongoDB
CentOS 7.6安装 MongoDB 5.0.2
CentOS 7.6安装 MongoDB 5.0.2
2231 0
CentOS 7.6安装 MongoDB 5.0.2
|
Android开发
错误记录:调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity 无法启动
本文记录了一个Android TV设置中由于未设置`android:exported="true"`导致`com.android.tv.settings.device.storage.ResetActivity`无法被第三方app启动的错误,并通过添加该属性成功解决了问题。
245 1
|
前端开发 JavaScript 开发者
CSS进阶-过渡与动画的事件监听
【6月更文挑战第16天】**CSS过渡和动画事件增强交互性,但监听与控制需谨慎。了解`transitionend`用于CSS过渡结束时的响应,避免过度使用JavaScript检测变化。示例代码展示如何绑定`transitionend`事件并在结束后执行操作。对于CSS动画,理解`animationstart`, `animationiteration`, `animationend`事件的生命周期至关重要,确保在动画结束后进行适当的清理。通过这些技巧,优化用户体验并提高代码效率。**
226 5
|
JavaScript 数据安全/隐私保护
Vue中如何使用过滤器来隐藏手机号、邮箱等字符串的中间部分内容
这篇文章介绍了在Vue中如何使用过滤器来隐藏手机号和邮箱等字符串的中间部分内容,以提高隐私保护。文章展示了实现效果,并提供了实现过程的代码示例,包括HTML部分的绑定、data部分的数据定义和script部分的过滤器定义。文章还解释了过滤器的概念、语法和使用方式,并提供了一个外部链接供读者获取更加详细的过滤器知识。
|
11月前
|
数据采集 存储 数据挖掘
构建电商数据采集系统初定位
构建电商数据采集系统需经历需求分析、技术选型、系统设计、开发实现、测试优化及部署维护六大步骤。过程中要明确目标与数据范围,选择合适的工具和数据库,并设计合理的架构与采集策略。还需考虑合法合规、分布式采集、数据质量控制及动态调整等策略,确保系统高效、稳定运行,适应电商环境变化。
|
机器学习/深度学习 算法 自动驾驶
深度学习之分布式智能体学习
基于深度学习的分布式智能体学习是一种针对多智能体系统的机器学习方法,旨在通过多个智能体协作、分布式决策和学习来解决复杂任务。这种方法特别适用于具有大规模数据、分散计算资源、或需要智能体彼此交互的应用场景。
823 4
|
存储 负载均衡 关系型数据库
分布式架构|打造高效、稳定、灵活的现代IT基石
分布式架构|打造高效、稳定、灵活的现代IT基石
600 1
|
存储 关系型数据库 MySQL
Percona XtraBackup有哪些优点?
【5月更文挑战第13天】Percona XtraBackup有哪些优点?
216 1
|
Cloud Native 架构师 云计算
秒杀高并发场景实战 | 在线直播
秒杀等高并发场景下,同一时刻会有大量的用户请求到达服务器,在保证系统整体稳定的前提下,如何通过有限的服务器资源,尽可能快速处理更多的请求,是用户需要解决的核心问题。本次直播以典型的秒杀场景为例,为您深入剖析在高并发场景下,阿里云相关解决方案和实战经验。
7273 59
秒杀高并发场景实战 | 在线直播