用户控制DirectShow VMR9视频显示在解锁计算机时冻结

时间:2012-03-02 09:33:53

标签: c# user-controls directshow directshow.net

我在WinForm中有一个自定义用户控件,我用它来显示使用VMR9 / DirectShow.Net的流式视频。我将解码后的帧提供给自定义PushSource过滤器。当计算机被锁定然后解锁时,我看到奇怪的行为

  1. 如果我这么快就这么做,那么一旦我解锁电脑,视频就会开始播放。
  2. 有时在视频重新开始显示之前会有5到60秒的延迟
  3. 有时视频显示永远无法恢复。
  4. 我还应该补充一点,我可以在计算机锁定时使用FFMpeg录制视频,并且还确认帧已插入源过滤器但未显示(解锁后)

    我使用IMediaEvent添加了一个线程来监控图形事件。当我启动流媒体/图表时,我看到事件ClockChanged和Paused(即使它正在播放)。当我解锁计算机时,我看到事件VMRRenderDeviceSet param1 = 2,param2 = 0和Paused(param1 = 0,param2 = 0)。

    我的图形拓扑是(自定义)推送源过滤器 - >色彩空间转换器 - > Ds .Net Grabber - >色空间转换器0001 - >视频混合渲染器9。

    此外,我可以在显示屏冻结时抓取正确的框架,因此似乎问题是VMR9。

    根据所提供的信息,任何人都可以解释可能出错的问题吗?我可以根据需要提供任何其他细节。

3 个答案:

答案 0 :(得分:2)

如果您使用windows7预定义编解码器然后用类似xvid的东西替换它们,在win7中我丢失了3d设备时遇到了同样的问题,可能是由于使用了ctrl + alt + del或类似的东西。

请检查此链接: http://www.codecguide.com/windows7_preferred_filter_tweaker.htm

配置完成后,只需运行graphstudio并在其中拖动一个avi文件,这样您就可以看到系统使用的编解码器。在ctrl + alt + del。

之后,您将在graphedit中看到与默认win7代码相同的行为

但实际上是默认win7编解码器处理重置设备的一些问题。

答案 1 :(得分:0)

这是错误:

  

// // MessageId:VFW_E_BUFFER_NOTSET // // MessageText:// //否   缓冲区空间已设置。%0 //   定义 VFW_E_BUFFER_NOTSET ((HRESULT)0x8004020CL)

此错误代码应该有原因,并且VMR本身不太可能。也许上游过滤器(什么是拓扑?)是这个错误的绊脚石。也许您可以看到图表生成的其他事件,您可以接收和处理这些事件。

答案 2 :(得分:0)

使用自定义分配器时,我遇到了同样的问题。当我们锁定计算机然后DirectX设备将丢失并且所有绘图将停止时的原因。如果是这种情况,请尝试使用device.reset方法重置设备。 Here是要恢复的样本。希望对你有所帮助。