Encoding 如何在录制和输入实时视频流之间同步?

Encoding 如何在录制和输入实时视频流之间同步?,encoding,ffmpeg,directshow,video-capture,video-recording,Encoding,Ffmpeg,Directshow,Video Capture,Video Recording,我正在做一个项目,在这个项目中,我从一些输入视频设备接收原始帧。我正在尝试使用FFMPEG库将这些帧写入视频文件中。 我无法控制从输入源获得的帧速率。该帧速率在运行时也会变化。 现在我的问题是如何在录制的视频和即将播放的视频之间进行同步。取决于我在FFMPEG中设置的帧速率,以及我接收到的录制视频播放的实际帧速率比输入视频快或慢。 我尝试在编码视频中添加时间戳(如numOfFrames),如下链接所示 但那没用 请告诉我一种同步两者的方法。这是我第一次使用FFMPEG或任何多媒体库,因此任何示

我正在做一个项目,在这个项目中,我从一些输入视频设备接收原始帧。我正在尝试使用FFMPEG库将这些帧写入视频文件中。 我无法控制从输入源获得的帧速率。该帧速率在运行时也会变化。 现在我的问题是如何在录制的视频和即将播放的视频之间进行同步。取决于我在FFMPEG中设置的帧速率,以及我接收到的录制视频播放的实际帧速率比输入视频快或慢。 我尝试在编码视频中添加时间戳(如numOfFrames),如下链接所示 但那没用

请告诉我一种同步两者的方法。这是我第一次使用FFMPEG或任何多媒体库,因此任何示例都将受到高度赞赏

我正在使用directshow ISampleGrabber接口捕获这些帧。
谢谢

所以我终于想出了办法。下面是如何

首先,我从源过滤器的preview pin获取预览,它不给帧加时间戳。所以应该从源过滤器的捕获管脚获取帧。而在
SampleCB
回调函数中,我们无法使用
imedisample::GetTime()
获得时间。但此函数将以100ns为单位返回时间。FFMPEG要求以1/时间为单位。这里,time_base是所需的帧速率。 因此,directshow时间戳需要首先以FFMPEG单位进行转换。然后我们可以在ffmpeg的
AVFrame::pts
变量中设置pts。需要考虑的另一件事是,在FFMPEG中,视频的第一帧应具有0的时间戳,因此在从directshow时间戳转换为FFMPEG时间戳时需要注意这一点


谢谢

所以我终于想出了办法。下面是如何

首先,我从源过滤器的preview pin获取预览,它不给帧加时间戳。所以应该从源过滤器的捕获管脚获取帧。而在
SampleCB
回调函数中,我们无法使用
imedisample::GetTime()
获得时间。但此函数将以100ns为单位返回时间。FFMPEG要求以1/时间为单位。这里,time_base是所需的帧速率。 因此,directshow时间戳需要首先以FFMPEG单位进行转换。然后我们可以在ffmpeg的
AVFrame::pts
变量中设置pts。需要考虑的另一件事是,在FFMPEG中,视频的第一帧应具有0的时间戳,因此在从directshow时间戳转换为FFMPEG时间戳时需要注意这一点


谢谢你

你的每一帧都有时间戳,你还需要什么对不起,我没有给你。这是我第一次做这个。每一帧上的时间戳在哪里?您是指ISampleGrabber输出吗?您有带有
ISampleGrabber::SampleCB
的帧。每个媒体样本都附有一个时间戳
IMediaSample::GetTime
(它是可选的,但几乎总是在那里,或者它是一个实时提要)。我正在处理实时提要。我可以在FFMPEG编码中使用相同的时间戳吗?好的!我在
SampleCB
中做了一些快速测试
IMediaSample::GetTime
为我返回
VFW\u E\u SAMPLE\u TIME\u NOT\u SET
,这意味着此示例没有时间戳。在这种情况下我该怎么办?你每帧都有时间戳,你还需要什么?对不起,我没弄明白。这是我第一次做这个。每一帧上的时间戳在哪里?您是指ISampleGrabber输出吗?您有带有
ISampleGrabber::SampleCB
的帧。每个媒体样本都附有一个时间戳
IMediaSample::GetTime
(它是可选的,但几乎总是在那里,或者它是一个实时提要)。我正在处理实时提要。我可以在FFMPEG编码中使用相同的时间戳吗?好的!我在
SampleCB
中做了一些快速测试
IMediaSample::GetTime
为我返回
VFW\u E\u SAMPLE\u TIME\u NOT\u SET
,这意味着此示例没有时间戳。在这种情况下我该怎么办?