我从CBaseVideoRenderer
重新设置了directshow视频渲染器。渲染器用于从实时源(BDA)接收数据的图形中。看起来连接已正确建立,但视频渲染会立即结束,因为没有样本。但是,音频渲染可以工作,即我可以听到声音,而我的渲染器的DoRenderSample
永远不会被调用。
逐步调试调试器中的代码,我发现在CBaseRenderer::StartStreaming
中,流会立即结束,因为成员m_pMediaSample
是NULL
。如果我用EVR渲染器替换我的渲染器,它会显示帧,即流不是在EVR渲染器的第一帧之前结束,而是仅用于我的渲染器。
为什么会这样,我该如何解决?我实施了(根据http://www.codeproject.com/Articles/152317/DirectShow-Filters-Development-Part-Video-Render的示例)我理解为基本界面(CheckMediaType
,SetMediaType
和DoRenderSample
),因此我认为没有任何可能影响正在这里发生......
编辑:这是从ROT看到的图表:
我基本上尝试做的是捕获使用VIDEOINFOHEADER2
的DVB流,标准样本采集器不支持。虽然该频道是没有加密的德国公共电视频道,但这可能是DRM问题吗?
编辑2:我已将渲染器附加到另一个来源(Blackmagic Intensity Shuttle)。它会导致源出现问题,因为我在另一个图中得到了样本。
编辑3:按照罗马的建议,我创建了一个转换过滤器。该图表看起来像
a遗憾的是同样的问题,即我没有得到任何样本(Transform
未被调用)。
答案 0 :(得分:0)
看起来您的解码器或拆分器不会对视频帧进行解复用。进一步查看链条以查看哪些过滤器为渲染器引脚提供数据,很可能是它唯一识别音频。
尝试将文件放入Graphedit(在网络BTW上有一个更好的文件)并查看它创建的过滤器。
然后查看DirectShow SDK中的示例。
答案 1 :(得分:0)
你应该选择从媒体管道中取出视频帧的错误路径。因此,您正在实现一个“网络渲染器”,它会终止管道以进一步将数据发送到网络。
接受Feed的渲染器听起来合适。但是,实现自定义渲染器是一项非典型的任务,因此没有太多关于此的信息。此外,功能齐全的渲染器通常配备了样本调度部分,它是流传输的结束 - 当您通过从基类继承来定制它时相对容易破解。也就是说,虽然方法听起来不错,但您可能希望将其与您拥有的其他选项进行比较,即...
Sample Grabber + Null Renderer的组合,两个标准过滤器,您可以将回调附加到并获取正确终止管道的帧。这里的问题是标准Sample Grabber不支持VIDEOINFOHEADER2
。使用另一个视频解码器,您可以获得馈送解码信息VIDEOINFOHEADER
,这是一个选项。然后改进Sample Grabber本身就是另一种解决方案:DirectX SDK Extras February 2005 (dxsdk_feb2005_extras.exe)是SDK,它包含一个类似于标准Sample Grabber的过滤器,称为Grabber \DirectShow\Samples\C++\DirectShow\Filters\Grabber
。它在源代码中可用,并提供了良好的描述文本文件。扩展相对容易,允许它接受VIDEOINFOHEADER2
并以这种方式为您的应用程序提供有效负载数据。
从DirectShow图表中获取数据的最简单方法,如果您不打算使用 MultiMedia Streaming,可能是编写自己的TransInPlace过滤器,一个子品种 变换过滤器。然后将此过滤器连接到所需的数据流 监视,然后运行,暂停,搜索或以其他方式控制图形。数据通过时 通过变换过滤器,可以根据需要进行操作。我们称之为 过滤器,一个样本抓取器。微软发布了一款功能有限的样本采集器 用DX8.0。此过滤器是有限的,因为它不处理DV数据或媒体类型 格式为VideoInfo2。它不允许用户接收预先打印的样本。 (什么是预卷样本?参见DX8.1文档)其ЊOneShotћ模式也存在一些问题。
除此之外,Grabber示例本身非常简单 - 可能包含1000行代码,包括注释。