ffplay 实现暂停、seek等的逻辑基础

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. 退出播放

代梳理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值