
这是系列文章中的第二篇,主要涉及播放器的缓冲区管理.
在上一篇文章中,我们提到了缓冲区用于将单线程模型的数据流转换为多线程模型,从而可以有效地抵抗网络的抖动和解码,防止频繁的阻塞和也要充分利用它. 下图显示了多核CPU的计算能力:

播放器的读取线程将IO和Parser模块输出的“未编码”音频和视频数据包放入“帧缓冲区”队列中,并将解码后的数据存储在“显示缓冲区”队列中.
让我们深入研究. 这个“帧缓冲区”和“显示缓冲区”扮演什么角色?
2.1帧缓冲区
帧缓冲区,作为“读取线程”和“解码线程”之间的缓冲池,它主要扮演三个角色:
1. 抵抗网络抖动
2. 抵抗解码抖动
3. 避免因花屏而导致被动帧丢失

假设没有“帧缓冲区”,即: IO->解析器->整个过程是串行的,那么将存在以下潜在问题:
1. 当IO网络不稳定(例如: 短暂的拥塞,无法读取数据)时网页音频播放器缓冲条,整个数据链将被卡住,并且只能等待IO恢复
2. 也会出现“抖动”,因为解码一些复杂的视频帧将花费很长时间. 如果卡住,则同一IO模块只能等待.
3. 因为整个过程是串行的,所以每个帧必须是IO->解析器->将在完成后读取并处理下一帧. 然后,当网络抖动时,将出现服务器端的TCP. 协议栈缓存更多数据. 当网络恢复后,当网络交付给客户端时,由于接收不及时,TCP传输队列已满,并且发生被动帧丢失,由于数据不完整,导致随后的解码屏幕.
2.2显示缓冲区
显示缓冲区,作为“解码线程”和“显示线程”之间的缓冲池,主要发挥三个作用:
1. 实现“声像同步”的必要条件
2. 抵抗渲染抖动
假设没有“显示缓冲区”,即: ->渲染器整个过程是串行的,那么将存在以下潜在问题:
1. 无论是视频帧还是音频数据,解码后都会立即发送到渲染模块,并且无法添加音频和图片同步的逻辑处理
2. 如果渲染模块中存在“抖动”,则会直接阻止,并且无法异步解码帧缓冲区中的数据,这会降低效率

了解缓冲区的功能,让我们看一下缓冲区中的数据是如何填充的?
缓冲区的数据填充主要分为两种情况,第一种称为“主动缓冲”,另一种称为“被动缓冲”
主动缓冲: 指播放器主动挂起缓冲区的数据消耗,等待数据产生者逐渐填充数据直到达到一定条件然后恢复
被动缓冲: 这意味着数据消耗的速度无法赶上生产速度,从而被动地将数据保留在缓冲区中
主动缓冲主要用于按需场景. 为了减少频繁的冻结,在视频开始播放之前网页音频播放器缓冲条,数据将被缓冲一段时间(例如: 10秒),然后开始播放. 当缓冲区中的数据由于网络抖动和其他原因而被消耗时,它将再次开始缓冲,依此类推.

如图所示,假设播放器缓冲区中的数据低于低水位,它将主动暂停播放并开始缓冲过程,直到缓冲区中的数据达到M水位为止.
被动缓冲(主要是在直播情况下)可能有两个原因:
1. 手机和其他设备的解码性能不足,例如对1080P高清晰度视频进行软解码,导致视频解码和渲染速度无法赶上视频读取速度,从而导致数据在“帧缓冲区”中积累
2. 网络的频繁抖动会阻止客户端及时获取数据以进行解码和渲染. 当网络恢复后,数据将被快速传送,但是播放器无法快速使用它(因为播放速率是固定的,除非添加了追逐帧的逻辑,否则后续文章将对其进行详细介绍) )

了解缓冲区的作用后,如何确定这两个缓冲区的大小?首先,我们需要知道这两个缓冲区大小究竟会影响或确定什么?
1. 缓冲区越大->抗抖动能力越强
2. 缓冲区越大->内存使用率越高
3. 缓冲区越大->播放延迟越大
可以看出,缓冲区越大越好. 需要根据实际使用情况决定.
“显示缓冲区”实际上是解码线程和渲染线程之间的桥梁. 由于解码和渲染之间的抖动不频繁,因此不需要特别大的缓冲区. 最小约为3帧. 在生产中,一帧正在消耗,一帧在缓冲区中处于待机状态.
“帧缓冲区”用于抵抗网络抖动. 网络抖动通常更频繁,抖动时间有时更长,因此应将“帧缓冲区”设置为较大,但是前提是它会影响内存和回放延迟.
对于现场广播场景,为了防止“被动帧丢失”,默认情况下通常将“帧缓冲区”设置为“无限”. 当缓冲区达到某个阈值时,将开始一些诸如活动帧丢失或多次回放的操作. 快速使用缓冲内容的方式,从而减少内存和延迟.
在以下情况下,播放器将主动清除缓冲区中的数据:
1. 播放器重置
2. 播放进度条被拖动

3. 消除累积的延误
4. 系统内存警报

ijkplayer的使用非常广泛. 让我们以它为例,看看播放器缓冲区的真实情况是什么?
1. 播放器开机后,缓冲100ms,然后开始播放
2. 如果卡住了(缓冲区为空),请暂停播放,将缓冲区缓冲到1000ms,然后开始播放
3. 如果再次卡住,则缓冲到2000ms并重播,依此类推,直到5000ms
可以看到其缓冲区的最大阈值逐渐增加,这是对用户体验的最佳优化,因为如果用户网络不是很糟糕,则无需等待5秒钟就无需先进行缓冲.
p>
此处共享播放器的缓冲区管理. 如有任何疑问,请致信lujun.hust@gmail.com进行交流. 此外,也欢迎大家关注我的新浪微博@卢_俊或微信公众号@Jhuster,获取最新文章和信息.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-264190-1.html
鱼子酱我还真吃不下
得了便宜还卖乖