在流之间共享数据
翻译自MSDN - Sharing Data Between Streams
处理多媒体数据通常需要大量的系统资源;因此,你应该尽可能的避免数据拷贝操作。流式架构支持共享流采样,这是一种将一个流中的数据移动到其他流中而无需拷贝操作的机制。这可以使两个流之间的数据传输更加高效,即便目的流并不支持当前的数据格式。
比如,假设你有一个多媒体流,其中包含了三个数据流:视频和音频,以及匹配视频内容并且带有时间戳的URL数据。你想编写一个程序,用来在每一个视频帧上添加一个版权通告,并将数据写到另一个流来存储,但是你的程序除了视频流之外不支持其他任何数据流。对于视频流来说,你创建了一个附加到必要的DirectDraw表面的采样。然后你可以使用相同表面的指针来调用IDirectDrawMediaStream::CreateSample方法或是IMediaStream::CreateSharedSample方法来创建一个输出流。不管怎么创建,输入和输出流会共享DirectDraw表面。因为你可以处理视频格式,所以你可以按照你需要的方式来访问这个表面。
为了得到其他来源流的指针(音频和URL),通过对源容器流进行枚举来获取那些非视频流的指针。这些来源流每一个在输出流容器中都有一个相应的输出流。可以使用每一个来源流的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法来获取这些输出指针。下面的步骤描述了这个过程:
调用IMultiMediaStream::EnumMediaStreams方法来获取来源流的指针。注意来源流不能是视频流,因为你的程序可以处理它的格式。
使用步骤1中得到的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法。这会返回一个指向所需输出流的指针。
调用来源流的的AllocateSample方法。
调用输出流的CreateSharedSample方法。
调用来源流的Update方法来读取数据。
调用输出流的Update方法来写入数据。
对那些格式不支持的流重复以上步骤。当所有采样完成更新,输出流就会有所有来源流的数据,你的工作也就完成了。