翻译自MSDN - Using Multimedia Streams in Applications
多媒体流接口不再依赖那些具有某些特性的硬件或软件来源,这样极大简化了处理多媒体数据的过程,并提供了对所有微软DirectX®媒体格式的支持。流将数据抽象到了一个很高的层次;应用程序可以将一个流的数据移动到另一个流中而无需了解数据格式的任何东西。
可以通过下列步骤来创建一个多媒体流:
创建多媒体流。创建和初始化的方法是由架构所决定的。DirectShow支持IAMMultiMediaStream接口,它可以用来初始化流。其他的以进程内服务器来实现的IMultiMediaStream则采用不同的机制来创建和初始化。
在多媒体流对象被初始化之后,应用程序会使用QueryInterface来获取对象的IMultiMediaStream接口。使用这个接口来确定流的属性和枚举它自身的流。你也可以使用特定的用途ID(purpose ID)来调用IMultiMediaStream::GetMediaStream方法以获取特定的流。MSPID_PrimaryVideo 和MSPID_PrimaryAudio(表示主视频和音频流)是最常用的用途ID。
调用IUnknown::QueryInterface来获取特定流媒体类型的接口。举例来说,如果你想渲染一个视频流,那么就获取它的IDirectDrawMediaStream接口。对于特定媒体的接口,必然定义了更多的方法,以便能更有效的使用一种格式的功能。
从流数据中创建一个或多个采样。每种媒体流都支持通过IMediaStream::CreateSharedSample方法来创建采样。得到的采样支持IStreamSample 接口,该接口提供了对采样和采样特性的控制。通常,媒体流支持特定格式创建采样的方法,这些方法比上述的IStreamSample功能更强大。比如,IDirectDrawMediaStream可以创建附加到所需DirectDraw表面和部分矩形(clipping rectangle)的采样。但是,在某些情况下你必须处理未知数据格式的数据。如果你要处理与其格式无关的流数据,使用IMediaStream::CreateSharedSample方法来创建数据采样。
在创建所有的流采样之后,调用IMultiMediaStream::SetState(使用STREAMSTATE_RUN标志作为参数)来启动流。
调用IStreamSample::Update来更新流采样。当IStreamSample::Update方法退出的时候,你可以访问采样的数据。如果你想在Update返回时触发一个特定的事件或者函数,可以传递适当的指针给IStreamSample::Update方法。