欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

八、FFmpeg把音频流同步到视频流

程序员文章站 2024-03-26 08:39:05
...

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