使用DirectShow将字幕文件与MPEG视频精确同步

时间:2008-12-11 20:06:31

标签: c++ video directshow mpeg

这是我已经处理了一段时间的问题,并且未能得到一个好的答案(即使是来自Microsoft)。我正在使用通用转储过滤器将硬件压缩的MPEG文件写入磁盘。在图中,我还有一个SampleGrabber过滤器,可以在每一帧上调用。从SampleGrabber回调中,我得到一个字幕,以及DirectShow时间戳,并将它们写出到SAMI(.smi)字幕文件。这一切似乎都有效,因为SAMI文件包含每帧的正确字幕。但是,我有一些问题:

  1. 前几个(通常是3或4个)DirectShow时间戳都是0.如果我从SampleGrabber获得回调,那么这些时间戳不应该递增吗?

  2. 当我开始播放时,显示的第一个时间戳是SAMI文件中的大约10-20个字幕。我假设第一帧将显示文件中的第一个时间戳。

  3. 这可能与#2有关,但字幕未与文件中的相应帧同步。它们有时可能会晚到40帧。

  4. 我正在使用DirectShow通过C ++,使用Windows XP SP3下的Hauppauge HVR-1800(最新驱动程序09/08/2008)捕获,并在Media Player Classic 6.4.9.0下播放。欢迎任何想法。

1 个答案:

答案 0 :(得分:2)

您是否正在使用传入的IMediaSample的GetTime或GetMediaTime。 GetTime是你想要的,因为它代表了流的呈现时间。

请务必检查传入的IMediaSample的isPreRoll功能。应忽略预卷样本,因为它们将在播放期间再次输出。我要做的另一件事是确保你的样本采集器尽可能远离你的滤波器下游。最好在任何解复用器和渲染器之后。

另请参阅DirectShow文档中有关TimeStamps的文章。它概述了使用时间戳的其他警告。

当然,即使在上述所有提示之后,仍然无法绝对保证特定DirectShow过滤器的行为方式。