八、FFmpeg把音頻流同步到視頻流

1、同步音頻

現在我們已經有了一個比較像樣的播放器了,最後讓我們再來看一下剩下的一些簡單的細節。在上章中我們說過也可以把音頻同步到視頻的,本章我們就來實現這個功能。這和把視頻同步到音頻是類似的:用一個內部視頻時鐘記錄視頻線程播放了多久,然後把音頻同步到這個時鐘上。最後我們再會進一步推廣,把音頻和視頻都同步到外部時鐘。

 

2、實現視頻時鐘

首先我們要實現一個類似音頻時鐘的視頻時鐘:一個給出當前視頻播放時間的變量。可能你覺得這和使用上一幀的PTS來更新定時器一樣簡單。但是要注意了,當我們把視頻幀間的時間間隔轉化爲毫秒的時候,這個間隔是很長的。所以我們採用另外一個辦法,把視頻時鐘設置成我們爲上一幀設置PTS的那個時間。於是當前視頻時間值就是PTS_of_last_frame + (current_time -time_elapsed_since_PTS_value_was_set)。這種解決辦法和get_audio_clock函數的方法很相似。 爲此我們要在大結構體中,加上一個double型變量videoCurrentPts和一個int64_t型變量videoCurrentPtsTime,時鐘更新將被放在refresh_video_timer函數中。

void refresh_video_timer(void *userdata) {
// ...
if(videoSate->pVAVStream) {
    if(videoSate->picQueueSize == 0) {
      schedule_refresh(videoSate, 1);
    } else {
      vp = &videoSate->videoPicQueue[videoSate->picQueueRIndex];

      videoSate->videoCurrentPts = vp->pts;
      videoSate->videoCurrentPtsTime = av_gettime();
// ...
}

記得在stream

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章