1、缓冲策略
ffmpeg有自带缓存区,由于不对外暴露,无法很好的控制,经常出现播放花屏问题,当然我们可以修改源码,但通常做法是,忽略ffmpeg本身缓存区,自己实现缓冲队列,通常播放器底层会有两个队列解码队列(压缩数据)
渲染队列(非压缩数据)
由于渲染队列通常有3帧左右的缓存就够了,所以当我们计算播放器的downloadSize的时候,通常说的是解码队列
的数据总和,当解码队列
为空的时候向上层抛开始缓冲消息,渲染器停止消费,为了播放器顺畅播放(减小卡顿率)当队列里有一定数据的时候抛出缓冲结束消息,渲染器再开始消费
点播:
点播场景一般会在端上架一套缓存系统,我们称之为localserver,作用是实时缓存播放的数据,省端上的流量,由于内存原因播放器会设置解码队列最大值,通常设置为15~20s,即当到达门限的时候不在调用av_read_frame(fmtCtx, &pkt)
直播:
直播场景由于数据是实时产生,通常不会有很多冗余数据,所以解码队列不会设置门限
2、同步
- 什么是同步播放?
- 为什么会有不同步现象?
- 如何实现同步播放?
- 同步所带来的的问题
- 同步策略
- 什么是同步播放?
不同媒体流按照时间戳对齐顺序播放
- 为什么会有不同步现象?
点播场景媒体文件容器的格式中音视频流并不是严格顺序存储,直播场景采集端音视频不均匀等原因都会导致不同步问题
- 如何实现同步播放?
由于人体对声音更加敏感,即音频稍有不连续就会被感知,所以音频需要连续播放,视频同步到音频,算法写在视频渲染线程里,核心逻辑实现了音视频同步,视频帧率控制,通过计算Apts、Vpts之间的差值动态调整视频渲染的sleepTime,A-V绝对值控制在60ms以内就能达到同步,帧率控制比较简单,就是根据fps控制两次渲染的时间间隔
- 同步所带来的的问题
同步会造成延时,由于按音频进行同步,当音频帧间隔较大的时候会造成视频过多堆积,当音频时间戳不连续的时候会造成视频跳帧,因此保证音视频打上正确的时间戳和音视频均匀尤为重要
- 同步策略
播放器一会有三种同步模式:流畅模式
低延时模式
智能追帧模式
流畅模式:即播放器不丢帧、不追帧,特点是延时高,卡顿率低
低延时模式:丢帧,特点是延时很低可以控制在1秒以内,但是卡顿率会高些
智能追帧模式:不丢帧、追帧,特点是延时稍微高、卡顿率稍微低些
网友评论