音视频播放器的 核心业务逻辑总结

总结音视频播放器的一些核心业务,帮助后续业务深入思考。
本文主要讨论的是一个播放器个底层核心业务逻辑,及其思路,主要是内部逻辑,并不涉及UI,用户操作逻辑层面。

播放器基础业务逻辑框架—解析/解压/渲染/同步

任何一个平台的播放器,都可以简化到下面的整体的示意图。
在这里插入图片描述
1、source:表示源文件,可以是本地文件或者网络流媒体。是播放器的输入。
2、demux:封装解析分流器,主要用于把音视频文件进行解封装分流,生成独立的视频压缩文件和音频压缩文件。
3、video decorder && audio decorder:视频解压和音频解压,如字面含义,分别把对应的视频压缩文件如h264,音频压缩文件如ACC 解压为非压缩的视频YUV数据和音频PCM数据。这里涉及各种视频音频的解压协议。
4、video render && audio render:视频渲染和音频渲染。拿到要显示的视频和音频帧后,利用平台的API,对视频进行绘制转换和音频播放转化,比如视频的缩放、裁剪、比例调整等,音频的特效添加。渲染结束后一般调用平台API直接通过输出设备进行输出。
5、sync:同步模块,这里一般就指视频和音频时间的同步,一般情况以音频时间戳为主(人对声音变化敏感),对视频进行丢帧和重复帧调整视频位置信息,保证视听同步。
6、video output device && audio output device:音视频输出设备,如显示器,音响设备,在渲染过程 平台API提供输出功能,平台API最终会调到对应设备的底层系统驱动,通过硬件设备驱动控制输出设备,把画面和声音传播出来。

播放器关键设计 缓存帧—模块特性需求/并行效率/抗抖动

进一步细化设计,各个模块处理速度有差异,渲染模块取决于输入帧实际帧率(如25hz视频源,理论上每40ms消耗一帧,如果时在50hz刷新输出设备上,相当于每2次刷新更新一个输入帧),解码模块通常取决与 解码性能(如过硬件解码 看硬件解码逻辑性能如何,软件解码依赖CPU性能),通常情况(在支持的视频输入范围内)解码效率一定是优于渲染间隔的,此时 解码工作往往会被 渲染反压(等待渲染模块把 解码后的内容使用完成 归还后再作为输出buffer继续处理)。

各个模块之间都会存在一些fifo缓存,用来保留上一级别模块送过来的数据包。这种设计主要有几方面的述求:

1、抗轮转抖动:实际的系统环境较复杂,比如 网络流 如果 网络不稳定,那么demux处理可能较慢,同样的解码器也可能由于总线争抢某个时刻耗时较长,如果没有这些fifo存在,就容易出现某个时刻 渲染 需求的帧不足,引入卡顿。
2、sync视音同步:前面已经提到,sync模块常常会以声音的时间戳信息去控制视频渲染模块 丢帧 或者 重复帧,如果没有视频渲染模块的缓存帧区域,丢帧后很难保证前级即时送帧过来,也会引起卡顿。
3、模块特性的需求:理想状态下 每个模块 最少需要一帧就可以进行处理输出,实际上会要求更多,举个例子:视频解码模块 解压视频帧的时候 有前后级别参考关系,要解压出一帧 需要持有多帧才能处理,具体数量还得看协议。视频渲染模块也是类似的,渲染过程涉及大量算法处理,很多算法模型天然设计时候 就需要前后时域上参考帧,也就需要持有更多输入才能输出。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201021073634926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3J1bmFmdGVyaGl0,size_16,color_FFFFFF,t_70#pic_center
缓冲区大小设计
缓冲区越大,优点是那么抗抖动能力越强,缺点是内存需求更多,同时从输入到显示的延时会更大。
缓冲区大小设计原则:把前后级模块 作为生产者和消费者,至少需要满足:生产者生产最低输出需求 + 消费者最低工作输入需求数 + 1帧轮转,比如 生产者 视频解码(输入ok情况)输出1帧就可以解码,渲染模块 需要持有 2帧 才能正常渲染,那么最小就是 1(解码需求)+2(渲染需求)+1(轮转)= 4 帧。但要注意这样基本没有抗抖动能力,实际会针对特定业务场景 对通路 效果/延时/平滑/输入场景特性/甚至码流特性 做更细化的缓冲方案。

播放器关键设计 音视频同步—时间戳/同步原理/同步方式

音视频的同步核心在于保持 显示的画面和音频输出 时间一致。这是一个动态的调整过程,在整个播放过程中会持续的监控调整,音视频同步的核心在于对对时间匹配的控制。

音视频同步技术的原理
在制作视频时,采样视频录制 和 音频录制 的 时候带上时间戳,表示这一帧应该在什么时候输出,然后进行视频和音频分别的编码,最后封装在一起。播放视频就是一个逆向的过程,解封装后分别进行音视频的解码,解码后 得到帧内容的同时也会 得到 该帧的PTS(Presentation Time Stamp),即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。 音频帧和视频帧都有各自的PTS,音视频的同步就是在 获取 显示视频和正播放的音频 PTS进行调整控制。
(备注:相对PTS,这里要注意一个DTS(Decoding Time Stamp),即解码时间戳的概念,由于视频压缩过程由于参考方向不同有 I/B/P 帧的差异,导致它的解码顺序和显示顺序不同)
在这里插入图片描述
音视频同步方式
1、视频同步到音频:即以音频为主时间轴作为同步源,对视频进行重复显示或丢弃帧(最典型,人对声音卡顿更敏感)
2、音频同步到视频:即以视频为主时间轴作为同步源
3、音频和视频同步到系统时钟:即以系统时钟为主时间轴作为同步源

音视频同步策略简介(视频同步到音频)
从视频解码完成fifo队列 取帧送渲染时,先获取 正在显示的音频PTS 和 视频PTS,比较获得它们的时间pts_diff。
此时一般有一个阈值决定要不要进行同步,如threshold为10m或者100ms。如果pts_diff < threshold,即音视频差距在合理偏差范围,就不进行同步。超过threshold后,如果视频比音频快,需要控制视频重复帧降低PTS变化,如果比音频慢,需要控制丢弃视频帧用新帧渲染。

播放器关键设计 延时控制与优化(待更新)
播放器关键设计 播控行为策略(待更新)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值