2015-01-21 384 views
0

我有一个基本的avstream驱动程序(基于avshws示例)。我的YUY2输出不适用于Video Renderer过滤器

当测试YUY2输出I得到不同的结果基于我使用的渲染器:

  • 视频渲染器:空白图像
  • VMR-7:加扰图像(由于使用具有一缓冲器的渲染器较大的步幅)
  • VMR-9:完美呈现

我不知道为什么基本的视频渲染器(由AMCAP使用)不会工作。我已经检查了输出相同格式的网络摄像机的图形,除了渲染器输出外,我看不到任何区别。

+0

也许是坏的媒体类型。您尚未发布相关详情。 – 2015-01-21 07:21:35

+0

请您详细说明一下吗? – djp 2015-01-21 10:47:23

+0

由“您尚未发布相关详情。”我的意思是你应该在图表检查中增加你发现的内容:特别是“相同格式”和“任何差异”。否则,你要求我们在黑暗中拍摄。 – 2015-01-21 10:54:23

回答

1

我假设你正在编写基于avshws的自己的过滤器。我不熟悉这个特定的示例,但通常您需要确保两件事:

  • 确保您的筛选器检查提出的任何媒体类型都是可以接受的。在DirectShow基类中,视频渲染器调用输出引脚IPin::QueryAccept,该引脚调用您正在使用的任何基类成员,例如, CBasePin.CheckMediaTypeCTransformFilter.CheckTransform
  • 确保您在每个输出样本上拨打IMediaSample::GetMediaType,并做出适当的响应。调用CTransformFilter.SetMediaType并更改输出的格式/步幅。现在谈判已经太迟了 - 您已经接受了更改,如果您确实无法继续操作,则必须中止流式传输,并返回错误HRESULT,并返回EC_ERRORABORT或EC_ERRORABORTEX。除非它有问题,否则下游过滤器应该调用您的输出引脚的QueryAccept,并在它发送带有媒体类型更改的样本之前收到S_OK(我已经看到了偶尔的过滤器,可以在不询问的情况下向第一个样本添加重复的媒体类型)。

Handling Format Changes from the Video Renderer

0

我想通了这个问题。我错过了一行来更新流指针结构中的其余字节:

Leading-> OffsetOut.Remaining = 0;

这导致某些过滤器丢弃我的样本(AVI/MJPEG Decompressor,Dump),这意味着某些图形配置将不会呈现任何东西。

相关问题