媒体播放器探索之IMediaObject
2016-04-15 04:33
423 查看
IMediaObject 接口为集成一个Directx媒体对象提供了诸多方法,其方法如下:
AllocateStreamingResources:
这个函数通过媒体对象DMO分配任何需要的资源,这个方法的调用时可选的。如果成功返回S_OK,如果失败,这个返回值将指示错误。一个应用程序可以调用这个方法用作最优流,在流开始之前,这个应用程序会获得这个媒体对象去执行初始化的机会,在设置媒体格式之后调用了这个方法,在ProcessInput和ProcessOutput之前。
HRESULT Discontinuity(
DWORD dwInputStreamIndex
);
dwInputStreamIndex 以0为基础的索引,这个索引属于在一个媒体对象上的输入流
返回值:
一个中断信号出现以后,后续的输入流是不会再继续
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
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
);
设置输出类型
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 |
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
);
设置输出类型
相关文章推荐
- 使用Object.defineProperty实现简单的js双向绑定
- Effective Object C 2.0——熟悉Object-C
- Android ObjectAnimator 无限循环播放,实现上下左右浮动效果
- Object常用方法介绍及注意事项equals(),hashCode(),getClass(),toString()
- From C++ to Objective-C
- Java中的Object2
- 09.---抽象类、接口、instanceof、final、Object
- Objective-C之KVO(键值监听)
- Object-C 类
- 第二章 Object-c 读书笔记
- objective-c - 类实例变量的声明
- 关于Objective C类方法load和initialize
- 挺好的 保存一下,有空看 《漫谈Objective-C :空段selector》
- 由删除要素属性引发的联想(api的很多东西本质上都是object,可以通过对object的操作来进行修改等)
- Objective-C初学: 对象的初始化
- Objective-C之KVC(键值编码)
- oc开发笔记2 AUGraph 完成同时录音与播放
- 关于Objective - C
- Block初探
- 学习ios【1】Objective-C 基本语法