使用PTS同步FFMPEG视频帧

Synchronizing FFMPEG video frames using PTS

本文关键字:视频 FFMPEG 同步 PTS 使用      更新时间:2023-10-16

我正在尝试同步从MP4视频解码的帧。我正在使用FFMPEG库。我已经解码并存储了每一帧,并成功地在OPENGL平面上显示了视频。

就在循环浏览这些帧之前,我启动了一个计时器;目的是正确地同步视频。然后,我将每个帧的PTS与这个计时器进行比较。我在解码过程中存储了从数据包接收到的PTS。

我的应用程序中显示的内容似乎没有达到我预期的速度。它比媒体播放器中的原始视频文件播放速度更快。

我对FFMPEG和视频编程缺乏经验。我处理这个问题的方式不对吗?

下面是我尝试做的一个例子

            FrameObject frameObject = frameQueue.front();
            AVFrame frame = *frameObject.pFrame;
            videoClock += dt;
            if(videoClock >= globalPTS)
            {
                //Draw the Frame to a texture
                DrawFrame(&frame, frameObject.m_pts);
                frameQueue.pop_front();
                globalPTS = frameObject.m_pts;
            }

请注意,我使用的是C++、Windows、Opengl、FFMPEG和VS2010 IDE

首先,使用int64_t pts = av_frame_get_best_effort_timestamp(pFrame)获取pts。其次,您必须确保正在同步的两个流使用相同的时基。最简单的方法是将所有内容转换为AV_TIME_BASE_Q。pts = av_rescale_q ( pts, formatCtx->streams[videoStream]->time_base, AV_TIME_BASE_Q );在此格式中,pts以纳秒为单位。