使用PTS同步FFMPEG视频帧
Synchronizing FFMPEG video frames using PTS
我正在尝试同步从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以纳秒为单位。
相关文章:
- FFmpeg——使用硬件加速进行视频解码
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- FFmpeg原始视频大小参数
- C++ ffmpeg 视频缺少帧,无法在 Quicktime 中播放
- 如何将视频级别分配给 ffmpeg 中的结构 AVCodecContext
- 如何使用FFMPEG从编码的视频中提取AVPACKET的重要信息
- 如何在不重写整个视频文件的情况下仅替换流中的一个数据框架?(ffmpeg)
- ffmpeg/c++ 使用 ffmpeg 对视频帧的附加信息进行编码
- 使用 ffmpeg 将平面 RGB 图像组合成无损视频
- 如何使用C 中的FFMPEG获取视频fps
- C++/C FFmpeg 伪影跨视频帧构建
- 如何使用FFMPEG与C拦截编码的视频数据
- 使用FFMPEG编写多线程视频和音频数据包
- 使用最新的 ffmpeg API (2017) 创建视频
- 视频太快 FFmpeg
- 如何将opencv视频发送到ffmpeg
- FFMPEG如何有效地解码视频框架
- FFmpeg + OpenAL - 播放视频中的流声音不起作用
- 寻求使用 FFmpeg 在 mp4 容器中 h264 编解码器的视频帧.数据包 pts 始终为 0
- FFMPEG 无法显示视频的持续时间