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