close

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 可以看作"聲音還剩下多少播放時間"
兩者相減就是影像播出時間慢了多少

arrow
arrow
    全站熱搜

    BB 發表在 痞客邦 留言(0) 人氣()