在流之间共享数据
2005-08-24 14:27
295 查看
翻译自MSDN - Sharing Data Between Streams
处理多媒体数据通常需要大量的系统资源;因此,你应该尽可能的避免数据拷贝操作。流式架构支持共享流采样,这是一种将一个流中的数据移动到其他流中而无需拷贝操作的机制。这可以使两个流之间的数据传输更加高效,即便目的流并不支持当前的数据格式。
比如,假设你有一个多媒体流,其中包含了三个数据流:视频和音频,以及匹配视频内容并且带有时间戳的URL数据。你想编写一个程序,用来在每一个视频帧上添加一个版权通告,并将数据写到另一个流来存储,但是你的程序除了视频流之外不支持其他任何数据流。对于视频流来说,你创建了一个附加到必要的DirectDraw表面的采样。然后你可以使用相同表面的指针来调用IDirectDrawMediaStream::CreateSample方法或是IMediaStream::CreateSharedSample方法来创建一个输出流。不管怎么创建,输入和输出流会共享DirectDraw表面。因为你可以处理视频格式,所以你可以按照你需要的方式来访问这个表面。
为了得到其他来源流的指针(音频和URL),通过对源容器流进行枚举来获取那些非视频流的指针。这些来源流每一个在输出流容器中都有一个相应的输出流。可以使用每一个来源流的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法来获取这些输出指针。下面的步骤描述了这个过程:
调用IMultiMediaStream::EnumMediaStreams方法来获取来源流的指针。注意来源流不能是视频流,因为你的程序可以处理它的格式。
使用步骤1中得到的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法。这会返回一个指向所需输出流的指针。
调用来源流的的AllocateSample方法。
调用输出流的CreateSharedSample方法。
调用来源流的Update方法来读取数据。
调用输出流的Update方法来写入数据。
对那些格式不支持的流重复以上步骤。当所有采样完成更新,输出流就会有所有来源流的数据,你的工作也就完成了。
处理多媒体数据通常需要大量的系统资源;因此,你应该尽可能的避免数据拷贝操作。流式架构支持共享流采样,这是一种将一个流中的数据移动到其他流中而无需拷贝操作的机制。这可以使两个流之间的数据传输更加高效,即便目的流并不支持当前的数据格式。
比如,假设你有一个多媒体流,其中包含了三个数据流:视频和音频,以及匹配视频内容并且带有时间戳的URL数据。你想编写一个程序,用来在每一个视频帧上添加一个版权通告,并将数据写到另一个流来存储,但是你的程序除了视频流之外不支持其他任何数据流。对于视频流来说,你创建了一个附加到必要的DirectDraw表面的采样。然后你可以使用相同表面的指针来调用IDirectDrawMediaStream::CreateSample方法或是IMediaStream::CreateSharedSample方法来创建一个输出流。不管怎么创建,输入和输出流会共享DirectDraw表面。因为你可以处理视频格式,所以你可以按照你需要的方式来访问这个表面。
为了得到其他来源流的指针(音频和URL),通过对源容器流进行枚举来获取那些非视频流的指针。这些来源流每一个在输出流容器中都有一个相应的输出流。可以使用每一个来源流的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法来获取这些输出指针。下面的步骤描述了这个过程:
调用IMultiMediaStream::EnumMediaStreams方法来获取来源流的指针。注意来源流不能是视频流,因为你的程序可以处理它的格式。
使用步骤1中得到的指针来调用输出容器的IMultiMediaStream::GetMediaStream方法。这会返回一个指向所需输出流的指针。
调用来源流的的AllocateSample方法。
调用输出流的CreateSharedSample方法。
调用来源流的Update方法来读取数据。
调用输出流的Update方法来写入数据。
对那些格式不支持的流重复以上步骤。当所有采样完成更新,输出流就会有所有来源流的数据,你的工作也就完成了。
相关文章推荐
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
- [Unity&GameSparks]如何实现玩家之间的数据共享
- iOS app之间共享数据的几种方法
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(4)
- 使用水晶报表的共享变量(Shared)即可实现在主/子报表之间的数据共享
- JAVA多线程之间共享数据BlockingQueue介绍
- 【转】Android 应用程序之间数据共享—ContentResolver
- Android activity之间数据传递和共享的方式之Application
- rails关于一个Action的多次或多个Action之间共享数据的思路
- Android 应用程序之间数据共享—ContentResolver
- APP/扩展( Extension )之间数据共享空间_APPGroup
- Angular2父子组件之间数据传递:父子组件共享服务通信
- angulajs 如何在controller 之间共享数据
- Android 应用程序之间数据共享—ContentResolver
- 创建数据共享接口——简化框架之间相互传值
- [置顶] 多个线程之间共享数据的方式
- 不同模块之间的数据共享
- 程序之间数据的共享,UIActivityViewController类让你的程序进入AirDrop列表
- 多个oracle数据库之间数据共享-database link
- 【Java多线程与并发库】7.多个线程之间共享数据的方式探讨