我的 YUY2 输出不适用于视频渲染器过滤器



我有一个基本的 avstream 驱动程序(基于 avshws 示例)。

在测试 YUY2 输出时,我根据我使用的渲染器得到不同的结果:

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

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

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

  • 确保筛选器检查建议的任何媒体类型是否可接受。在 DirectShow 基类中,视频呈现器调用输出引脚 IPin::QueryAccept,该引脚调用您正在使用的任何基类成员,例如 CBasePin.CheckMediaType 或 CTransformFilter.CheckTransform
  • 确保在每个输出样本上调用 IMediaSample::GetMediaType 并做出适当的响应,例如调用 CTransformFilter.SetMediaType 并更改输出的格式/步幅。此时进行协商为时已晚 - 您已经接受了更改,如果您真的无法继续,则必须中止流式传输,返回错误 HRESULT 并通知EC_ERRORABORT或EC_ERRORABORTEX。除非它有问题,否则下游筛选器应该在发送附加了媒体类型更改的示例之前调用输出引脚的 QueryAccept 并收到S_OK(我偶尔看到过滤器将重复的媒体类型添加到第一个示例而不询问)。

请参阅从视频呈现器处理格式更改

我已经解决了问题所在。我缺少一行来更新流指针结构中的剩余字节:

前导偏移>偏移量。剩余 = 0;

这导致某些过滤器丢弃我的样本(AVI/MJPEG 解压缩器、转储),这意味着某些图形配置根本不会渲染任何内容。

最新更新