DirectShow视频流立即结束(m_pMediaSample为NULL)

时间:2014-07-07 16:36:45

标签: c++ directshow renderer

我从CBaseVideoRenderer重新设置了视频渲染器。渲染器用于从实时源(BDA)接收数据的图形中。看起来连接已正确建立,但视频渲染会立即结束,因为没有样本。但是,音频渲染可以工作,即我可以听到声音,而我的渲染器的DoRenderSample永远不会被调用。

逐步调试调试器中的代码,我发现在CBaseRenderer::StartStreaming中,流会立即结束,因为成员m_pMediaSampleNULL。如果我用EVR渲染器替换我的渲染器,它会显示帧,即流不是在EVR渲染器的第一帧之前结束,而是仅用于我的渲染器。

为什么会这样,我该如何解决?我实施了(根据http://www.codeproject.com/Articles/152317/DirectShow-Filters-Development-Part-Video-Render的示例)我理解为基本界面(CheckMediaTypeSetMediaTypeDoRenderSample),因此我认为没有任何可能影响正在这里发生......

编辑:这是从ROT看到的图表:  Running Object Table Entry

我基本上尝试做的是捕获使用VIDEOINFOHEADER2的DVB流,标准样本采集器不支持。虽然该频道是没有加密的德国公共电视频道,但这可能是DRM问题吗?

编辑2:我已将渲染器附加到另一个来源(Blackmagic Intensity Shuttle)。它会导致源出现问题,因为我在另一个图中得到了样本。

编辑3:按照罗马的建议,我创建了一个转换过滤器。该图表看起来像

ROT of graph with grabber

a遗憾的是同样的问题,即我没有得到任何样本(Transform未被调用)。

2 个答案:

答案 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行代码,包括注释。