配置 Demux 输出引脚

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

当 MPEG-2 demux 收到数据包时,它必须确定哪个输出引脚应分析和传送数据。 在程序流模式下,demux 将流 ID 映射到输出引脚。 在传输流模式下,它将 PID 映射到输出引脚。 例如,在传输流模式下,如果 PID 0x31映射到引脚 0,则具有该 PID 编号的每个 TS 数据包将路由到输出引脚 0。 如果 demux 接收的数据包的流 ID 或 PID 未映射到任何输出引脚,则它只是放弃该数据包。

在拉取模式下,demux 会自动为文件中的音频和视频流创建输出引脚,并将流 ID 映射到引脚。

在推送模式下,输出引脚必须由应用程序或其他筛选器配置。 对于使用广播驱动程序体系结构 (BDA) 的数字电视源,网络提供商筛选器与 TIF 筛选器配合使用来配置 demux。 应用程序无需执行任何操作。 在其他方案中,应用程序必须配置输出引脚。

demux 开始时没有输出引脚。 若要创建输出引脚,请在筛选器上调用 IMpeg2Demultiplexer::CreateOutputPin 方法。 此方法采用媒体类型和固定名称,并返回 IPin 指针。 当引脚连接到另一个筛选器(通常是解码器)时,将使用媒体类型-例如, 将 Demux 与基本流配合使用部分。 引脚名称可以是你喜欢的任何内容,但不允许重复的固定名称。

接下来,将一个或多个流 ID 或 PID 分配给新的输出引脚。 对于程序流,查询 IMPEG2StreamIdMap 的引脚并调用 IMPEG2StreamIdMap::MapStreamId。 对于传输流,请查询 IMPEG2PIDMap 的固定并调用 IMPEG2PIDMap::MapPID

通过多种方式,demux 可以分析 TS 数据包。 对于每个输出引脚,分析方法由 MapPID 方法的 MediaSampleContent 参数确定。

说明
MEDIA_ELEMENTARY_STREAM 筛选器提供 PES 有效负载。 在此模式下,筛选器对 PES 数据包进行解压缩,因此下游筛选器接收 ES 字节流,而无需 PES 数据包标头。 仅 (音频和视频流。)
MEDIA_MPEG2_PSI 筛选器提供完整的 PSI 部分,例如 PAT 表、PMT 表、CAT 表等。
MEDIA_TRANSPORT_PAYLOAD 筛选器从 TS 数据包中提取有效负载并传递它们,而无需进一步分析。 对于基本流,这意味着 demux 将传递整个 PES 数据包,包括 PES 数据包标头。
MEDIA_TRANSPORT_PACKET 筛选器传递整个 TS 数据包。 demux 根据其 PID 路由 TS 数据包,但不检查或处理数据包。 不会筛选出有错误的数据包。demux 不会重新多路复用数据包,并且生成的输出流不符合 MPEG-2 传输流。 此模式称为 直通 模式。

 

对于程序流,demux 始终提供 PES 有效负载。

使用 MPEG-2 Demultiplexer