【发布时间】:2014-07-07 16:36:44
【问题描述】:
我有一个 directshow 视频渲染器,它是从 CBaseVideoRenderer 重新编写的。渲染器用于从实时源 (BDA) 接收数据的图中。看起来连接已正确建立,但由于没有样本,视频渲染立即结束。然而,音频渲染工作,即我可以听到声音,而我的渲染器的DoRenderSample 从未被调用。
在调试器中单步执行代码,我发现在CBaseRenderer::StartStreaming 中,流立即结束,因为成员m_pMediaSample 是NULL。如果我用 EVR 渲染器替换我的渲染器,它会显示帧,即流不会在 EVR 渲染器的第一帧之前结束,而只是我的渲染器。
为什么会这样,我该如何解决?我实现了(遵循http://www.codeproject.com/Articles/152317/DirectShow-Filters-Development-Part-Video-Render 的示例)我理解的基本接口(@987654331@、SetMediaType 和DoRenderSample),所以我看不到任何影响这里发生的事情的可能性......
编辑:这是从 ROT 看到的图表:
我基本上尝试做的是捕获使用 VIDEOINFOHEADER2 的 DVB 流,标准采样采集器不支持该流。虽然该频道是未加密的公共德国电视频道,但会不会是 DRM 问题?
编辑 2: 我已将渲染器附加到另一个源(Blackmagic Intensity Shuttle)。似乎是源导致了问题,因为我在另一张图中获得了样本。
编辑 3: 按照 Roman 的建议,我创建了一个变换过滤器。图表看起来像
不幸的是,我遇到了同样的问题,即我没有得到任何样本(Transform 未被调用)。
【问题讨论】:
-
我最好的猜测是您的过滤器中的问题:您的推导不正确或出现了问题,但您发布的内容还不够。渲染器应该等待样本,根据您的描述,您的渲染器会执行相反的操作并中止。
-
我基本上遵循了codeproject.com/Articles/152317/… 的示例,它只覆盖了完全相同的方法。据我了解,
CBaseVideoRenderer的实现应该代表我等待样本。 -
对于 Sample Grabber 中缺少
VIDEOINFOHEADER2支持的自定义视频渲染器看起来不是合适的解决方案。 -
罗曼,你这是什么意思?据我了解,微软的抓取器无法理解
VIDEOINFOHEADER2,也已被弃用。因此,我看到了两个选项:自定义渲染器或转换过滤器。据我了解,转换过滤器编写起来更复杂,所以我尝试了渲染器(我对 DShow 很陌生,所以我可能弄错了)。 -
\DirectShow\Samples\C++\DirectShow\Filters\Grabber此处:“Microsoft® DirectX® 9.0 SDK 更新(2004 年 10 月)附加内容”。不过,您可能不得不追逐下载。如果我没记错的话,它在 2005 年 2 月左右被完全删除。
标签: directshow c++ directshow renderer