您的位置:首页 > 移动开发 > Objective-C

媒体播放器探索之IMediaObject

2016-04-15 04:33 423 查看
IMediaObject 接口为集成一个Directx媒体对象提供了诸多方法,其方法如下:

AllocateStreamingResources:

  这个函数通过媒体对象DMO分配任何需要的资源,这个方法的调用时可选的。如果成功返回S_OK,如果失败,这个返回值将指示错误。一个应用程序可以调用这个方法用作最优流,在流开始之前,这个应用程序会获得这个媒体对象去执行初始化的机会,在设置媒体格式之后调用了这个方法,在ProcessInput和ProcessOutput之前。

  HRESULT Discontinuity(

   DWORD dwInputStreamIndex

);

dwInputStreamIndex 以0为基础的索引,这个索引属于在一个媒体对象上的输入流

 返回值:

Return code

Description

DMO_E_INVALIDSTREAMINDEX

Invalid stream index

DMO_E_NOTACCEPTING

The DMO is not accepting input.

DMO_E_TYPE_NOT_SET

The input and output types have not been set.

S_OK

Success

一个中断信号出现以后,后续的输入流是不会再继续

 

Discountinuity:

   向一个指定的输入流中发射中断信号。

Flush:

HRESULT Flush();

刷新整个缓冲的数据

FreeStreamingResources:

HRESULT FreeStreamingResources();

这个方法的调用时可选的。这个方法释放AllocateStreamSource 分配的所有资源。

GetInputCurrentType:

HRESULT GetInputCurrentType(

        DWORD          dwInputStreamIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

根据输入流类型的索引,得到当前媒体的格式。

typedef struct _DMOMediaType {

  GUID     majortype;//Major type GUID of the stream.

  GUID     subtype;//Subtype GUID of the stream.

  BOOL     bFixedSizeSamples;//If TRUE, samples are of a fixed size. This field
is informational only. For audio, it is generally set to TRUE. For video, it is usually TRUE for
uncompressed video and FALSE for compressed video.

  BOOL     bTemporalCompression;

/*如果是true  该例子是被压缩的使用暂时的使用帧间隔,意思是不是所有的帧都是关键帧,这个领域是仅有的信息。*/

  ULONG    lSampleSize;  // 该例子的大小用字节表示,对于压缩数据这个值可以是0.

  GUID     formattype;

/*指定媒体类型。

Format type:

  FORMAT_DvInfo 对应的结构体是

 

DVINFO:

  typedef struct tag_DVINFO {

  DWORD dwDVAAuxSrc;  // 指定第一个音频数据块的辅助资源包

  DWORD dwDVAAuxCtl; // 指定第一块音频数据块的音频辅助数据控制包

  DWORD dwDVAAuxSrc1; // 指定第二块的音频数据块的辅助包

  DWORD dwDVAAuxCtl1; // 指定第二块音频辅助数据包的音频辅助资源控制报

  DWORD dwDVVAuxSrc; // 指定第一块视频辅助资源包

  DWORD dwDVVAuxCtl; // 指定第一块块视频辅助控制资源包

  DWORD dwDVReserved[2]; // 保留,被设置为0.

} DVINFO, *PDVINFO;

 

 

  

  

*/

  IUnknown *pUnk; NULL

  ULONG    cbFormat;

  BYTE     *pbFormat;

} DMO_MEDIA_TYPE;

Format type: FORMAT_MPEG2Video 对应的结构体是

MPEG2VIDOEINFO:

typedef struct tagMPEG2VIDEOINFO {

  VIDEOINFOHEADER2 hdr;

/*

  typedef struct tagVIDEOINFOHEADER2 {

  RECT             rcSource;  // 原矩形大小

  RECT             rcTarget;  // 目标矩形大小

  DWORD            dwBitRate; // 视频流的大概比率。位每秒

  DWORD            dwBitErrorRate; // 视频流的错误数据比率,位每秒

  REFERENCE_TIME   AvgTimePerFrame; // 视频帧的显示时间,每纳秒

  DWORD            dwInterlaceFlags;

  DWORD            dwCopyProtectFlags;

  DWORD            dwPictAspectRatioX;

  DWORD            dwPictAspectRatioY;

  union {

    DWORD dwControlFlags;

    DWORD dwReserved1;

  };

  DWORD            dwReserved2;

  BITMAPINFOHEADER bmiHeader;

} VIDEOINFOHEADER2;

 

*/

  DWORD            dwStartTimeCode;

  DWORD            cbSequenceHeader;

  DWORD            dwProfile;

  DWORD            dwLevel;

  DWORD            dwFlags;

  DWORD            dwSequenceHeader[1];

} MPEG2VIDEOINFO;

Format type    Format structure

 

Format type

Format structure

FORMAT_DvInfo

DVINFO

FORMAT_MPEG2Video

MPEG2VIDEOINFO

FORMAT_MPEGVideo

MPEG1VIDEOINFO

FORMAT_None

None.

FORMAT_VideoInfo

VIDEOINFOHEADER

FORMAT_VideoInfo2

VIDEOINFOHEADER2

FORMAT_WaveFormatEx

WAVEFORMATEX

The caller must set the media type for the stream before calling this method. To set the media type, call theIMediaObject::SetInputType method.

GetInputMaxLatency:

HRESULT GetInputMaxLatency(

        DWORD          dwInputStreamIndex,

  [out] REFERENCE_TIME *prtMaxLatency

);

获得最大的延迟时间

GetInputSizeInfo:

HRESULT GetInputSizeInfo(

        DWORD dwInputStreamIndex, // 标识输入流

  [out] DWORD *pcbSize, //收到输入缓冲区的最小大小,用字节表示

  [out] DWORD *pcbMaxLookahead,// 能预测的最大数据,如果该出入流不预测数据,则是0

  [out] DWORD *pcbAlignment 输出序列需要的缓冲区,如果没有输出序列,则该值是1

);

 

对于一个指定的输入流需要多少缓冲区。

需要指定输入流的媒体类型。

GetInputStatus:

HRESULT GetInputStatus(

        DWORD dwInputStreamIndex, // 输入流的索引标志。

  [out] DWORD *dwFlags

);

查询指定的输入流的状态

GetInputStreamInfo:

HRESULT GetInputStreamInfo(

        DWORD dwInputStreamIndex,// 输入流的索引标志。

  [out] DWORD *pdwFlags

/*

enum _DMO_INPUT_STREAM_INFO_FLAGS {  DMO_INPUT_STREAMF_WHOLE_SAMPLES             = 0x00000001,

  DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER  = 0x00000002,

  DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE         = 0x00000004,

  DMO_INPUT_STREAMF_HOLDS_BUFFERS             = 0x00000008

 

};

 

*/

);

 

GetInputType:

HRESULT GetInputType(

        DWORD          dwInputStreamIndex, // 输入流

        DWORD          dwTypeIndex, // ,媒体流

  [out] DMO_MEDIA_TYPE *pmt

 /*

  typedef struct _DMOMediaType {

  GUID     majortype;

  GUID     subtype;

  BOOL     bFixedSizeSamples;

  BOOL     bTemporalCompression;

  ULONG    lSampleSize;

  GUID     formattype;

  IUnknown *pUnk;

  ULONG    cbFormat;

  BYTE     *pbFormat;

} DMO_MEDIA_TYPE;

 

*/

);

根据索引获得输入流的媒体信息

 

GetOutputCurrentType:

HRESULT GetOutputCurrentType(

        DWORD          dwOutputStreamIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

得到输出流的当前格式

GetOutputSizeInfo:

HRESULT GetOutputSizeInfo(

        DWORD dwOutputStreamIndex, // 输出流索引

  [out] DWORD *pcbSize, // 输出流的缓冲区的最小大小

  [out] DWORD *pcbAlignment // 输出队列的缓冲区,如果没有输出队列,则为1

);

 

GetOutputStreamInfo:

HRESULT GetOutputStreamInfo(

        DWORD dwOutputStreamIndex,

  [out] DWORD *pdwFlags

/*

enum _DMO_OUTPUT_STREAM_INFO_FLAGS {  DMO_OUTPUT_STREAMF_WHOLE_SAMPLES             = 0x00000001,

  DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER  = 0x00000002,

  DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE         = 0x00000004,

  DMO_OUTPUT_STREAMF_DISCARDABLE               = 0x00000008,

  DMO_OUTPUT_STREAMF_OPTIONAL                  = 0x00000010

 

};

 

*/

);

根据索引得到输出流的信息

 

GetOutputType:HRESULT GetOutputType(

        DWORD          dwOutputStreamIndex,

        DWORD          dwTypeIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

得到输出类型

 

GetStreamCount:

HRESULT GetStreamCount(

  [out] DWORD *pcInputStreams,

  [out] DWORD *pcOutputStreams

);

得到输入输出流的数量

 

Lock:

HRESULT Lock(

   LONG bLock

);

Block非0则需要,0则释放这个锁

 

ProcessInput: // 对指定的输入流传递缓冲区

HRESULT ProcessInput(

   DWORD          dwInputStreamIndex,

   IMediaBuffer   *pBuffer,

   DWORD          dwFlags,

enum _DMO_INPUT_DATA_BUFFER_FLAGS {  DMO_INPUT_DATA_BUFFERF_SYNCPOINT   = 0x00000001,

  DMO_INPUT_DATA_BUFFERF_TIME        = 0x00000002,

  DMO_INPUT_DATA_BUFFERF_TIMELENGTH  = 0x00000004

 

};

 

   REFERENCE_TIME rtTimestamp,

   REFERENCE_TIME rtTimelength

);

将输入流和缓冲区相关联

 

ProcessOutput:

SetInputMaxLatency:

HRESULT SetInputMaxLatency(

   DWORD          dwInputStreamIndex,

   REFERENCE_TIME rtMaxLatency

);

设置输入的最大延迟

 

SetInputType:

HRESULT SetInputType(

             DWORD          dwInputStreamIndex,

  [in] const DMO_MEDIA_TYPE *pmt,

             DWORD          dwFlags

);

设置输入类型

SetOutputType:

HRESULT SetOutputType(

             DWORD          dwOutputStreamIndex,

  [in] const DMO_MEDIA_TYPE *pmt,

             DWORD          dwFlags

);

设置输出类型

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: