4

我正在尝试同步从 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

4

1 回答 1

8

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

于 2014-09-15T18:13:52.530 回答