同步原理及流程:
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 (!<