我正在开展一个项目,我从一些输入视频设备接收原始帧。我正在尝试使用FFMPEG库在视频文件中编写这些帧。 我无法控制从输入源获得的帧速率。此帧速率也在运行时变化。 现在我的问题是如何在录制的视频和即将播放的视频之间进行同步。根据我在FFMPEG中设置的帧速率和我接收的录制视频播放的实际帧速率要比输入视频快或慢。 我尝试按照以下链接在编码视频中添加时间戳(如numOfFrames) 但这没有帮助。
请告诉我一种同步两种方法的方法。这是我第一次使用FFMPEG或任何多媒体库,因此任何示例都将受到高度赞赏。
我正在使用directshow ISampleGrabber接口捕获这些帧。 谢谢
答案 0 :(得分:1)
所以最后我想出了如何做到这一点。这是如何..
首先,我从源过滤器的PREVIEW引脚进行预览,它没有为帧提供时间戳。因此,应该从源滤波器的捕获引脚获取帧。与SampleCB
回调函数相比,我们无法使用IMediaSample::GetTime()
获得时间。但是这个函数将以100ns为单位返回时间。 FFMPEG要求它以1 / time_base为单位。这里time_base是期望的帧速率。
所以directshow时间戳需要首先在FFMPEG单位中转换。我们可以在ffmpeg的AVFrame::pts
变量中设置pts。需要考虑的另一件事是第一帧视频在FFMPEG中的时间戳为0,因此在从directshow时间戳转换为FFMPEG时需要注意。
谢谢