Windows软件插件-XVID视频解码器

下载本插件项目

本插件使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h3968

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值