DirectShow增强的视频渲染器特定于版本的行为

时间:2013-10-09 08:03:59

标签: wpf directshow h.264 mediaelement

我正在研究ip-cameras的视频流服务。我已经为DirectShow实现了RTSP源过滤器(在Live555上),它旨在用于我公司主要产品中的WPF MediaElement。在我的开发机器上它运行良好(Vista),因此我能够在Windows Media Player或任何其他使用DirectShow进行渲染的软件中观看流式H.264视频。

但是:在其他机器上(Windows 7),没有显示视频。 我发现Vista中的增强型视频渲染器(渲染器文件版本6.0.6002.18005)在上游过滤器IBaseFilter :: Pause和IBaseFilter :: Run方法上接收到“Play”命令后,最终路由到我的源过滤器。 在Windows 7中,EVR有不同的版本(6.1.7601.17514),其行为也不同:它只调用IBaseFilter :: Pause,并且不发出IBaseFilter :: Run。因此,一切都在CSourceStream :: FillBuffer方法上停止,直到超时返回E_FAIL,并且EndOfStream被下游发送到渲染器。有时,之后发布了EndOfStream IBaseFilter :: Run,但此时没有任何意义。

我尝试通过在CreateInstance方法中手动创建并添加到图表来提供另一个渲染器。它与Haali Video Renderer合作,Windows Media Player在其他机器上成功播放流式视频。但是,据我所知,MediaElement(其中的MediaPlayer)默认使用EVR,它忽略了由我创建的HVR(看起来如此),因此在任何机器上都没有视频。

我错过了使用EVR的东西吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我忘了重新实现IMediaFilter :: GetState()方法以在State_Paused中返回VFW_S_CANT_CUE。这样做解决了这个问题。