1

这是我一直在处理的一个问题,并且无法得到一个好的答案(甚至来自微软)。我正在使用通用转储过滤器将硬件压缩的 MPEG 文件写入磁盘。在图中,我还有一个 SampleGrabber 过滤器,它在每一帧都被调用。从 SampleGrabber 回调中,我得到一个字幕以及 DirectShow 时间戳,并将它们写入 SAMI (.smi) 字幕文件。这一切似乎都在工作,因为 SAMI 文件包含每一帧的正确字幕。但是,我有几个问题:

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

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

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

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

4

1 回答 1

2

您是否正在使用获取传入的 IMediaSample 的 GetTime 或 GetMediaTime。GetTime 是您想要的,因为它代表了流演示时间。

一定要检查传入的 IMediaSample 的isPreRoll函数。应忽略预卷样本,因为它们将在播放期间再次输出。我要做的另一件事是确保您的样本采集器尽可能位于您的过滤器图中的下游。最好在任何解复用器和渲染器之后。

另请参阅DirectShow 文档中有关时间戳的文章。它概述了使用时间戳的其他注意事项。

当然,即使经过上述所有提示,仍然不能绝对保证特定 DirectShow 过滤器的行为方式。

于 2008-12-12T14:26:46.293 回答