ffplay---源码分析(九):视频同步音频(ffplay默认同步方式)

本文详细解析ffplay中视频同步音频的过程,包括lastvp、vp和nextvp的帧同步,以及sync_threshold和compute_target_delay在延迟校准中的作用。基本策略是通过frame_timer调整播放速度,保持视频与音频的同步。当视频快于音频时重复显示上一帧,慢时丢帧追赶。关键在于利用帧显示时刻和系统时刻对比,维持一个“准同步”区域。
摘要由CSDN通过智能技术生成

同步原理及流程:
在这里插入图片描述
1、lastvp上一帧
2、vp当前帧
3、nextvp下一帧

static void video_refresh(void *opaque, double *remaining_time)
{
   
    //……
    last_duration = vp_duration(is, lastvp, vp);					上一帧理论显示时长last_duration
    delay = compute_target_delay(last_duration, is);				基于主时钟(音频)校准后得到上一帧应显示时长delay
1、系统时间time还没有到上一帧结束时间👉👉goto display;接着播放上一帧​lastvp
    time= av_gettime_relative()/1000000.0;							获取系统时刻
    if (time < is->frame_timer + delay) {
   //如果上一帧显示时长未满,重复显示上一帧
        *remaining_time = FFMIN(is->frame_timer + delay - time, *remaining_time); 
        goto display;
    }
2、反之,准备播放当前帧vp
    is->frame_timer += delay;//上一帧开始显示时间frame_timer更新为👉,也是当前帧开始时刻
    if (delay > 0 && time - is->frame_timer > AV_SYNC_THRESHOLD_MAX)
        is->frame_timer = time;//如果本帧开始时间与系统时间的偏离太大,则改用系统时间SDL_LockMutex(is->pictq.mutex);
    if (!<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值