我尝试同步从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
答案 0 :(得分: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是以纳秒为单位。