八、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

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