可选流

[与此页面关联的功能(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_BUFFERpBuffer 成员中指定的。此外,在 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