配置 ASF 拆分器对象

ASF 拆分器 对象是一个 WMContainer 层对象,用于分析高级系统格式的 ASF 数据对象 (ASF) 文件。 创建并初始化拆分器以分析媒体文件的 ASF 数据对象后,必须将拆分器配置为为特定流生成示例。 调用 IMFASFSplitter::SelectStreams 以选择所需的流。

(可选)应用程序还可以将其配置为按相反顺序生成示例或为受保护内容生成示例。 若要设置这些选项,请调用 IMFASFSplitter::SetFlags 并传递支持的标志的所需按位组合。 在调用此方法之前,客户端必须成功完成 IMFASFSplitter::Initialize 调用;否则, SetFlags 将失败并 MF_E_NOT_INITIALIZED 错误代码。 有关初始化拆分器的信息,请参阅 创建 ASF 拆分器对象

若要检查此标志当前是否在拆分器上设置,请调用 IMFASFSplitter::GetFlags

选择要分析的流

在通过 IMFASFSplitter::Initialize 调用的初始化过程中,拆分器会检测 ASF 文件中的流数和流标识符。 默认情况下,拆分器不会选择任何流。 应用程序必须通过调用 IMFASFSplitter::SelectStreams 来选择流。 此方法采用流数字数组。 若要获取流的流编号,请在 ASF 配置文件上调用 IMFASFProfile::GetStream ,或在流描述符上调用 IMFStreamDescriptor::GetStreamIdentifier 。 (可以从 ContentInfo 对象获取 ASF 配置文件和流描述符。) 如果客户端传递拆分器无法识别的流编号,它将失败并出现 MF_E_INVALIDSTREAMNUMBER 错误。

调用 SelectStreams 会清除前面的选择。 未选择数组中未指定的任何流。 若要获取当前选定的流列表,请调用 IMFASFSplitter::GetSelectedStreams。 此方法采用指向数组的指针,该方法用流数字填充该数组。 如果数组大小小于所选流的数量,该方法将失败并 出现MF_E_BUFFERTOOSMALL 错误。 在这种情况下, 方法返回 pwNumStreams 参数中的选定流数。 然后,可以使用此数字分配大小正确的数组,并再次调用 方法。

有关示例代码,请参阅 教程:读取 ASF 文件中的“选择要分析的流”。

反向播放设置

在拆分器初始化过程中,它会确定 ASF 内容是否支持反向播放。 如果这样做,可以通过设置 MFASF_SPLITTER_REVERSE 标志将拆分器配置为按相反顺序生成样本。 如果内容不支持反向播放, IMFASFSplitter::SetFlags 将返回 MF_E_INVALIDREQUEST,但标志在拆分器上设置。

如果拆分器配置为反向分析,则拆分器始终在包含 ASF 数据对象的缓冲区末尾开始分析。 因此,对于反向分析,必须适当设置数据偏移量和要分析的数据长度。 有关设置正确值的信息,请参阅 从现有 ASF 数据对象生成流示例

受保护的内容设置

可以通过 IMFASFSplitter::SetFlags 设置MFASF_SPLITTER_WMDRM,将拆分器配置为处理数据包级加密内容。 这会指示拆分器提供受 Windows Media 数字版权管理 (DRM) 保护的内容的示例。 设置此标志后,拆分器生成的示例包含解密媒体数据和重新构造帧所需的信息,例如 MFSampleExtension_PacketCrossOffsets 属性。 此属性是包含 DWORD数组的 Blob。 每个 DWORD 都提供帧相对于帧开头的有效负载边界。 如果此属性不存在,则帧包含在单个有效负载中。 通常,拆分器生成的样本包含多个媒体缓冲区,应用程序可以通过调用 IMFSample::ConvertToContiguousBuffer 将所有缓冲区复制到一个连续缓冲区中。 生成的缓冲区包含帧,属性值包含此缓冲区的偏移量。

ASF 拆分器