mplayer 播放時的循環過程:
while(!mpctx->eof){
fill_audio_out_buffers(); //音頻 stream 的讀取,解碼,播放
update_video(&blit_frame); //視頻 stream 的讀取,解碼,過濾處理
sleep_until_update(&time_frame, &aq_sleep_time); //計算延遲時間,並睡眠等待
mpctx->video_out->flip_page(); //視頻的播放
adjust_sync_and_print_status(frame_time_remaining, time_frame); //根據音視頻的PTS做同步矯正處理
}
音視頻同步方法為
1 => 音頻播放
playsize = mpctx->audio_out->play(sh_audio->a_out_buffer, playsize, playflags);
然後根據數據大小計算出時間並累計
mpctx->delay += playback_speed*playsize/(double)ao_data.bps;
2)視頻解碼前,用累計延遲扣掉目前視頻的時間 mpctx->delay -= frame_time;
3)計算聲音延遲時間 *time_frame = delay - mpctx->delay / playback_speed;
其中
float delay = mpctx->audio_out->get_delay();
為距離當前聲音 OUTPUT BUF 裡面數據被全部播放完為止所需的時間
4)播放視頻同步完成,所以視頻的播放是完全根據音卡最後的數據輸出來同步的
5)計算出目前音視頻 PTS 差 double AV_delay = a_pts - audio_delay - v_pts;
再算出矯正值
x = (AV_delay + timing_error * playback_speed) * 0.1f;
最後把矯正的時間加到延遲累計中 mpctx->delay+=x
---------------------------------------------------------------
mpctx->delay 可以看作"使用SCR為準,聲音播放多少時間之後,影像就需要播出"
delay 可以看作"聲音還剩下多少播放時間"
兩者相減就是影像播出時間慢了多少
留言列表