本插件使用DirectX媒体对象Mpeg4s Decoder DMO解码XVID视频,输出RGB32样本。插件类型为DLL。同时还可以解码mp4s,MP4S,m4s2,M4S2,MP4V,mp4v,xvid,DIVX,DX50,divx,dx50,H263;共可以解码13个编码方式。只在解码XVID视频流情况下做过测试,可以正常运行。
在加载本解码器DLL时,初始化COM库,创建Mpeg4s Decoder DMO对象,其接口为IMediaObject。在使用该对象解码样本之前,需为对象指定输入,输出媒体类型,此操作在导出函数SetType中进行,函数的参数1为DMO_MEDIA_TYPE结构,包含输入媒体类型信息,需正确指定结构参数;函数的参数2为RGB32样本输出函数的地址,在DLL外部定义该函数,将地址传递给参数2,输出RGB32样本时,DLL在内部调用该输出函数,参数提供RGB32样本缓冲区指针,样本大小,样本的时戳。向Mpeg4s Decoder DMO对象传递输入样本,由本DLL的导出函数实现,函数名为InputSample;参数1,提供输入样本缓冲区指针;参数2,输入样本的大小;参数3,样本时间戳的开始时间,单位100纳秒;参数4,并不是时间戳结束时间,而是样本的持续时间(结束时间等于开始时间+持续时间),单位100纳秒;参数5,同步点标志,是BOOL变量。
向Mpeg4s Decoder DMO对象传递样本,需创建输入输出缓冲区,缓冲区接口为IMediaBuffer,由CMediaBuffer类实现。
DLL的导出函数FindInputType用于获取Mpeg4s Decoder DMO对象的首选媒体类型,我们获取Mpeg4s Decoder DMO对象全部的允许输入媒体类型代码如下:
#include "Dmo.h"
#pragma comment(lib, "msdmo")
typedef int(__cdecl *MYPROC_FindInputType)(int index, DMO_MEDIA_TYPE& DMT);
HMODULE hModule = LoadLibrary(L"Mpeg4sDecoder.dll");
MYPROC_FindInputType FindInputType=(MYPROC_FindInputType)GetProcAddress(hModule, "FindInputType");
DMO_MEDIA_TYPE DMT; CString Text; int i = 0;
while (FindInputType(i, DMT) == S_OK)
{
i++;
LPWSTR lp = NULL;
HRESULT hr = StringFromCLSID(DMT.majortype, (LPOLESTR*)(&lp));//将主要类型GUID转换为字符
CString Man = lp;
CoTaskMemFree(lp);
hr = StringFromCLSID(DMT.subtype, (LPOLESTR*)(&lp));//将子类型GUID转换为字符
CString Sub = lp;
CoTaskMemFree(lp);
hr = StringFromCLSID(DMT.formattype, (LPOLESTR*)(&lp));//将格式类型GUID转换为字符
CString Form = lp;
CoTaskMemFree(lp);
CString Format;
if (DMT.pbFormat)
{
Format.Format(L"%u", DMT.pbFormat);
}
else
{
Format = L"NULL";
}
CString item;
item.Format(L"%d\r\n主要类型:%s\r\n子类型:%s\r\n格式类型:%s\r\n样本为固定大小:%d\r\n使用时间(帧间)压缩:%d\r\n样本大小:%u\r\n格式块的大小:%u\r\n格式块指针:%s",i,
Man,
Sub,
Form,
DMT.bFixedSizeSamples,
DMT.bTemporalCompression,
DMT.lSampleSize,
DMT.cbFormat,
Format
);
MoFreeMediaType(&DMT);
Text += L"\r\n" + item + L"\r\n";
}
SetDlgItemText(IDC_EDIT1, Text);
结果:
1
主要类型:{73646976-0000-0010-8000-00AA00389B71}//MEDIATYPE_Video
子类型:{7334706D-0000-0010-8000-00AA00389B71}//MEDIASUBTYPE_mp4s
格式类型:{00000000-0000-0000-0000-000000000000}//GUID_NULL//这里的意思,并不是不需要格式块,而是没有提供格式块
样本为固定大小:0
使用时间(帧间)压缩:1
样本大小:0
格式块的大小:0
格式块指针:NULL
2
主要类型:{73646976-0000-0010-8000-00AA00389B71}//MEDIATYPE_Video
子类型:{5334504D-0000-0010-8000-00AA00389B71}//MEDIASUBTYPE_MP4S
格式类型:{00000000-0000-0000-0000-000000000000}//GUID_NULL
样本为固定大小:0
使用时间(帧间)压缩:1
样本大小:0
格式块的大小:0
格式块指针:NULL
3
主要类型:{73646976-0000-0010-8000-00AA00389B71}//MEDIATYPE_Video
子类型:{3273346D-0000-0010-8000-00AA00389B71}//MEDIASUBTYPE_m4s2
格式类型:{00000000-0000-0000-0000-000000000000}//GUID_NULL
样本为固定大小:0
使用时间(帧间)压缩:1
样本大小:0
格式块的大小:0
格式块指针:NULL
4
主要类型:{73646976-0000-0010-8000-00AA00389B71}//MEDIATYPE_Video
子类型:{32533

1万+

被折叠的 条评论
为什么被折叠?



