【问题标题】:Synchronizing FFMPEG video frames using PTS使用 PTS 同步 FFMPEG 视频帧
【发布时间】:2014-11-08 09:12:18
【问题描述】:

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

【问题讨论】:

    标签: c++ opengl video ffmpeg pts


    【解决方案1】:

    首先,使用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 以纳秒为单位。

    【讨论】:

    • 应该是AV_TIME_BASE_Q,其值为(AVRational) {1, 100000}
    • szatmary,AV_TIME_BASE_Q 以微秒为单位,而不是纳秒。 @Kaidul Islam,你错过了一个零,AV_TIME_BASE_Q 的分母是一百万。
    猜你喜欢
    • 2015-11-05
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2015-11-02
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多