ffplay源码分析(七)播放控制

ffplay中的播放控制有哪些?

简单来说就是开始、结束、暂停、继续、跳转。

开始和结束前面都有说明,

所以主要分析暂停/恢复和跳转,

暂停 / 恢复

暂停恢复主要通过,stream_toggle_pause接口实现,

这个接口虽然看起来只有暂停的功能,实际上它负责暂停和继续状态的转换,上一次如果是暂停,这一次就继续,反之亦然。当然,如果用户想知道目前是开始还是暂停的状态,可以通过监听开始和暂停的状态来实现,不用自己再去记录状态。

/* pause or resume the video */
static void stream_toggle_pause(VideoState *is)
{
   
   
    if (is->paused) {
   
   
      // 这里表示当前是暂停状态,将切换到继续播放状态。在继续播放之前,先将暂停期间流逝的时间加到frame_timer中
        is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
        //TODO
        if (is->read_pause_return != AVERROR(ENOSYS)) {
   
   
            is->vidclk.paused = 0;
        }
        //设置视频时钟
        set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
    }
    //设置外部时钟
    set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
    //设置所有clock的状态
    is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
}

使用到get_clock的地方,会发现时间仿佛静止了。。。。。

static double get_clock(Clock *c)
{
   
   
    if (*c->queue_serial != c->serial)
        return NAN;
    if (c->paused) {
   
   
        //当暂停时,返回当前pts,即时间不再流逝了
        return c->pts;
    } else {
   
   
        double time = av_gettime_relative() / 1000000.0;
        return c
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值