在流之间共享数据

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

注意

这些 API 已弃用。 应用程序应使用 示例抓取器 筛选器或实现自定义筛选器,以从 DirectShow 筛选器图中获取数据。

 

处理多媒体数据通常需要大量的系统资源:因此,应尽可能避免复制数据。 流式处理体系结构支持共享流示例,这是一种在不复制数据的情况下将数据从一个流移动到另一个流的机制。 即使目标流不专门支持基础数据格式,此缓冲区也能在两个流之间高效传输数据。

例如,假设你有一个多媒体流,其中包含三个数据流:视频和音频,以及带有时间戳的 URL 数据,以匹配视频内容。 你想要编写一个应用程序,该应用程序在每个视频帧上添加版权声明,并将数据写入另一个流进行存储,但应用程序不了解除视频流以外的任何数据格式。 对于视频流,创建附加到所需 DirectDraw 图面的示例。 然后,可以通过使用指向同一图面的指针调用 IDirectDrawMediaStream::CreateSample 方法或 IMediaStream::CreateSharedSample 来创建输出流。 在这两种情况下,输入和输出流共享 DirectDraw 图面。 由于你了解视频格式,因此可以根据需要访问此图面。

若要检索音频和 URL) (其他源流指针,请枚举源容器流并抓取指向非视频流的指针。 每个源流在输出流容器中都有一个关联的输出流。 通过使用每个源流指针在输出容器上调用 IMultiMediaStream::GetMediaStream 方法检索这些输出指针。 以下步骤介绍了此过程。

  1. 调用 IMultiMediaStream::EnumMediaStreams 以检索指向源流的指针。 请确保它不是视频流,因为应用程序已经了解其格式。
  2. 使用步骤 1 中的指针在输出容器流上调用 IMultiMediaStream::GetMediaStream 。 这会返回指向所需输出流的指针。
  3. 在源流上调用 AllocateSample
  4. 在输出流上调用 CreateSharedSample
  5. 在源流上调用 Update 以读取数据。
  6. 在输出流上调用 Update 以写入数据。

对不支持其格式的每个流重复这些步骤。 当两个示例完成更新后,输出流将包含源流中的所有数据,并且你已完成。