Media Foundation学习笔记(五)Media Foundation的架构 Pipeline


Pipeline层是直接产生和处理媒体数据的层,它由“Media Sources”、“MFTs”和“Media Sinks”组成。大多数应用程序不需要直接调用Pipeline层对象的方法,而只需要使用如“Media Session”、“Source Reader”和“SinkWriter”这些上层的对象。


Media Sources



Media Sources产生媒体数据,典型的如:读文件、捕获设备或者网络流。


一个Media Source必须实现2个对象:一个Presentation描述符(描述了source中流的数目和各个流的媒体类型)和一个或者多个媒体流。


 接口:


  1. 必须暴露的接口(通过queryinterface获取):IMFMediaSourceIMFMediaEventGeneratorIMFMediaSource的父接口)。

  2. 可选的接口(通过IMFGetSrevcie获取):IMFRateControlIMFRateSupportIMFQualityAdviseIMFMetadataProvider。其中,如果要实现倍速播放,则必须暴露IMFRateControlIMFRateSupport接口。

  3. 必须实现的媒体流接口:IMFMediaStreamIMFMediaEventGenaratorIMFMediaStream的父接口)。

     

    一个Presentation是一组共享Presentation时间的相关的媒体流的集合。每一个Presentation描述符包含一个列表,列表项是流描述符。流有可以被选中,也可以不被选中,不被选中的流不会激活也不会产生数据。每个流描述符拥有一个媒体类型句柄。

    Presentation描述符主要接口是IMFPresentationDescriptor

    流描述符主要接口是IMFStreamDescriptor

    媒体类型句柄主要接口是IMFMediaTypeHandler

     

    每个Media Source都提供一个Presentation描述符,Presentation描述符描述了Media Source的默认配置。默认配置中,至少有一个流没选中,而每个被选中的流都有一个媒体类型。

    获取Presentation描述符:IMFMediaSource::CreatePresentationDescriptor,返回一个IMFPresentationDescriptor

    如果要修改Presentation描述符,只能在IMFMediaSource::Start之前;

    获取流的数目:IMFPresentationDescriptor::GetStreamDescriptorCount

    获取流描述符:IMFPresentationDescriptor::GetStreamDescriptorByIndexIndex0开始,返回一个IMFStreamDescriptor,并且也返回一个Boolean值标示该流是否被选中;

    选中流和不选中流:IMFPresentationDescriptor::SelectStreamIMFPresentationDescriptor::DeselectStream

    获取流的媒体类型句柄:IMFStreamDescriptor::GetMediaTypeHandler,返回一个IMFMediaTypeHandler

    获取流当前的媒体类型:IMFMediaTypeHandler::GetCurrentMediaType,返回一个IMFMediaType

    设置流当前的媒体类型:IMFMediaTypeHandler::SetCurrentMediaType

    获取流支持的媒体类型:IMFMediaTypeHandler::GetMediaTypeCountIMFMediaTypeHandler::GetMediaTypeByIndex,注意,GetMediaTypeCount可能没有包含流支持的每一类型,所以还可以使用IMFMediaTypeHandler::IsMediaTypeSupported检测是否支持某种特殊的媒体类型;

     

    Media Sources可以发送预定义Events,可可以发送自定义Events

    Media Source的预定义EventsMEEndOfPresentationEventMENewStream Event等等;

Media Stream的预定义EventsMEEndOfStream EventMEError Event等等。


MFTs


Media Foundataion Tranforms类似于DShow中的Transform Filters,用于编/解码器、数字信号处理。

类似于Transform FiltersMFTsStream数目也可以是1个或者多个,如下图:


接口:IMFTransform


获取输入输出端口支持的类型:IMFTransform::GetInputAvailableTypeIMFTransform::GetOutputAvailableType,一般要设置了输入类型后,MFTs才能提供支持的输出类型。


设置输入输出类型:IMFTransform::SetInputTypeIMFTransform::SetOutputType


输入数据:IMFTransform::ProcessInput,应用要提供Media Sample的指针。


输出数据:IMFTransform::ProcessOutput,有2中内存分配模式,一种是由MTFs提供分配,一种是由应用分配,有的MFT同时支持这2种模式,可以通过IMFTransform::GetOutputStreamInfo获取MFT支持的模式。

 

创建MTF对象三种方法:MFTEnumMFTEnumExCoCreateInstance。另外,某些MFTs可能提供了其它特殊的创建函数。


 MFTs有一个或者多个流,流用标识符来识别,MFTs用流的标识符作为参数。

一些MFTs支持添加和移除输入流,在运行时,支持添加和移除输出流。


Media Sinks


Media Sinks是媒体流的目的地。它们将将数据通过显卡、声卡呈现出来、将数据成有固定格式的文件、或者将数据发布到网络上等。


Renderer类型的Media Sink和其他类型的Media Sink的区别是它是按一个固定的速率消费数据。


Media Sink暴露IMFMediaSink接口,每个Media Sink都包含一个或者多个stream sinkstream sink暴露IMFStreamSink接口。




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页