DirectShow的自定义TS多文件源过滤器

时间:2011-04-18 17:26:10

标签: filter directshow

我在编写自定义DS源过滤器以播放转储到多个文件的TS流时遇到问题。 [编辑:重点是从这些单独的文件重新播放连续流]

首先我尝试修改Async文件样本:没有去 - 数据'pull'模型似乎将所有控制逻辑放在拆分器过滤器中,所以我不能欺骗它相信我有一个'连续'流。< / p>

然后尝试修改PushSource桌面示例:看来我们必须以这种方式保护MPEG解复用器以创建其输出引脚,自己解析数据以获取ID等。我设法让GraphStudio自动连接某些东西(使用一个奇怪的DTV-DVD解码器)但它没有播放任何东西,尽管源过滤器向下游推送正确的数据。

有没有人有这方面的经验来帮助/建议任何事情?

2 个答案:

答案 0 :(得分:0)

我创建了一个TS源过滤器,用于读取网络流。所以这也是连续的,但我从文件读取的不同之处在于,网络流自动给我正确的速度。所以我认为你应该能够使用类似的方法。

我的过滤器来自de dx sdk的FBall示例。

过滤器源自CSourceIFileSourceFilterIAMFilterMiscFlagsISpecifyPropertyPages。输出引脚仅来自CSourceStream

如果您在解码音频/视频时遇到问题,可能首先尝试使用简单的mpeg-2流,例如从DVB源播放。并确保安装了解码器并接受该格式。 (例如ffdshow默认关闭mpeg2解码)。

答案 1 :(得分:0)

您现在找到了解决问题的方法吗?

我正在编写类似的 DirectShow 过滤器,目前仅用于播放一个文件,但我认为修改它以播放多个文件应该不是问题。

我从“推送源位图”过滤器开始构建此过滤器,但我必须对其进行大量更改。

我还必须使用我编写的应用程序构建图形(因此不使用 GraphEdit ),将“ Mpeg-2解复用器”连接到新过滤器,添加一个 PSI 输出(映射到 PID 0 = PAT )和“ MPEG-2部分和表格过滤器 “连接到 PSI 输出。

之后,我使用“ MPEG-2 Sections and Tables Filter ”来读取 PAT 表和 PMT PIDs 它。接下来,我还将所有 PMT PID 映射到相同的“ MPEG-2部分和表格过滤器”,并解析 PMT 表以便了解基本流 PID 和媒体类型,接下来我根据这些信息创建了一个视频输出和一个音频输出(可能有多个音频+视频流,但在当前步骤中我只保留了第一)。请注意,这需要临时运行部分图形以便能够解析表格,然后停止它以便能够创建视频和音频输出引脚(使用适当的媒体类型)并连接解码器和渲染器。

除此之外,我还有一个您可以感兴趣的信息:看来,当连接时,“ Mpeg-2解复用器”会在图形中搜索一个过滤器,显示“ IBDA_NetworkProvider “接口,如果找到,它使用 IBDA_NetworkProvider :: RegisterDeviceFilter 方法向其注册。

我认为您可以使用它来检测“ Mpeg-2解复用器”过滤器插入到图表中(通过从您的过滤器中公开“ IBDA_NetworkProvider ”界面) ,并尝试从源过滤器进行上述操作,从而允许在 GraphEdit 中使用您的过滤器,并期望“ Mpeg-2多路分解器”来自于这个过滤器无需担心构建应用程序来执行这些操作。

银杏