这个真的让我把头发拉出来。我编写了一个从 CTransformFilter 派生的 DirectShow 变换过滤器。我从 CTransformInputPin 派生了一个输入引脚。当我的输入引脚的 Receive 方法被调用时,它会将 IMediaSample 的呈现时间记录到一个文件中。这一切都很好,直到我停止图表并重新启动它(我正在使用 MS 的 graphedt)。大多数时候,再次运行时,没有任何问题。但是,大约每十次左右我停下来然后再次运行图表,开始呈现时间是负数。随着图表的运行,它最终会增加到零并超过零,但它永远不会赶上流时间,因此流时间仍然明显领先于每个样本的呈现开始时间。
我用 Logitech Webcam Pro 9000 和 Logitech C600 相机观察到了这一点,但没有用 Winbook 相机观察到,所以我想知道这是否是 Logitech 的问题。有没有其他人在停止并再次运行后在视频 IMediaSamples 上看到负面的演示时间?(我查看了 IMediaSample 中的预卷标志:它始终为 S_FALSE。)
更新:
我已经用这个覆盖了 CTransformFilter(实际上是 CBaseFilter)的 Run 方法:
STDMETHODIMP MyTransformFilter::Run(REFERENCE_TIME tStart)
{
char buff[1000];
REFERENCE_TIME rTime;
m_pClock->GetTime(&rTime);
sprintf(buff, "Run tstart = %lld, rTime = %lld", tStart, rTime);
Trace(buff); // open my log file, add buff, close my log file
return CTransformFilter::Run(tStart);
}
我用 graphedt 启动图表,运行 10 秒,暂停 5 秒,然后重新开始。这是输出:
Run tstart = 7855978550000, rTime = 7855978450000
Run tstart = 7856030610000, rTime = 7856126960000
传递给 Run 的两次时间相差 5.2 秒(大约是我暂停的时间)。两个参考时钟时间相差 14.6 秒(大约是调用 Run 之间的总时间)。除了过滤器图形管理器略微增加传递给 Run 的时间(10 毫秒,在第一次调用中),我希望每次调用 Run 时这些几乎相同。相反,在第二次调用中传递给 Run 的时间比参考时钟晚了大约 10 秒。我将非常感谢帮助理解为什么第二次调用时传递给 Run 的时间与第二次调用时参考时钟返回的时间不同(几乎)相同。
更新 2:
问题似乎出在 Logitech 版本 13.31.1044.0 驱动程序中。请参阅下面的答案。