ffplay 如何实现的
- 暂停
- seek
- 倍速
- 逐帧播放
- 队列设计
- 音视频同步
- 退出 //
1. 暂停
停止 播放音频,视频 导致音频视频的缓冲队列,数据堆积,直到队列被填充满将不再进行解封装、解码操作。
2.seek
检测是否有seek事件发生,有-->调用 avformat_seek_file(),跳转成功后清空之前队列中的缓存,更新序列号,使得之前的数据不可用。
- 对 mp4 ⽂件来说,由于有索引表,可以快速找到某个时间戳所对应的数据,所以 seek 操作可以快速 完成。
- ts ⽂件没有时间戳和数据包位置的对应关系,所以对播放器来说,给定seek 的时间戳ts_seek,⾸先 应该根据⽂件的码率估算⼀个位置pos,然后获取该位置的数据包的时间戳ts_actual,如果ts_actual < ts_seek ,则需要继续往后读取数据包;如果ts_actual> ts_seek,则需要往前读取数据包,直到读到 ts_seek 对应的数据包。所以 ts ⽂件的操作可能更加耗时; 如果 ts 包含的是 CBR 码流,则 ts_actual 与 ts_seek ⼀般差别不⼤, seek 相对较快; 如果 ts 包含的 VBR 码流, 则 ts_actual 与 ts_seek 可 能相差甚远, 则 seek 相对较慢。
3. 逐帧播放
step记录是否进入逐帧播放模式,如果进入则播放当前帧,暂停播放。继续检测是否是逐帧播放模式 ······
4. 音视频同步
目的:音视频同步的主要目的是使播放的声音和显示的画面保持一致。在多媒体播放中,视频和音频是分别进行编码和解码的,由于编码和解码的速度不同,以及网络传输的延迟等因素,可能会导致音视频出现不同步的情况。因此,音视频同步的实现对于提高播放器的用户体验至关重要。
- 如果视频播放过快,则重复播放上⼀帧,以等待⾳频;
- 如果视频播放过慢,则丢帧追赶⾳频。
- 具体地,当当前时刻 小于 lastVp的结束时刻则继续显示lastVp;
当当前时刻 大于 lastVp的结束时刻 且 小于vp的结束时刻,播放vp;
当当前时刻 大于 vp 的结束时刻,且nextVp则舍弃 vp 播放nextVp。
5. 退出播放
代梳理