可选流

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

DMO 可以将其某些输出流指定为可选。 可选流生成应用程序可以完全丢弃的数据,或者偶尔会丢弃这些数据。 例如,可选流可能包含有关主流的附加信息。

若要查询流是否为可选流,请调用 IMediaObject::GetOutputStreamInfo 方法并检查 pdwFlags 参数。 可选流返回DMO_OUTPUT_STREAMF_DISCARDABLE标志或DMO_OUTPUT_STREAMF_OPTIONAL标志。 这些标志的含义几乎相同:它们之间的一个小区别将很快解释。

如果流是可选的,则客户端可以指示 DMO 在处理输出时放弃该流中的数据。 为此,请调用 IMediaObject::P rocessOutput 方法,并将要放弃的每个流的输出缓冲区设置为 NULL 。 (输出缓冲区在 DMO_OUTPUT_DATA_BUFFER.) 的 pBuffer 成员中指定。此外,在 dwFlags 参数中设置DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER标志。

对于 pBuffer 指针为 NULL 的每个流,DMO 将尝试放弃数据。 如果流是可选的,则保证 DMO 放弃数据。 如果流不是可选的,则 DMO 会尽可能放弃数据,但不保证这样做。 如果无法放弃数据,则会设置DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE标志。 如果将 pBuffer 指针设置为 NULL ,但不设置DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER标志,则 DMO 不会放弃数据。 在这种情况下,DMO 要么在内部缓冲输出,要么只是使 ProcessOutput 调用失败。

DMO_OUTPUT_STREAMF_OPTIONAL标志与DMO_OUTPUT_STREAMF_DISCARDABLE标志之间的唯一功能差异如下:

  • DMO_OUTPUT_STREAMF_OPTIONAL标志指示客户端不必在该流上设置媒体类型。 但是,如果客户端在不设置该流的媒体类型的情况下开始处理数据,则必须在整个流式处理期间丢弃该流中的数据。 如果要有选择地放弃样本,则必须设置介质类型。
  • DMO_OUTPUT_STREAMF_DISCARDABLE标志指示尽管流是可选的,但它始终需要媒体类型。

直接托管 DMO