directshow 采集摄像头数据并录制视频(含压缩)

本文介绍了使用DirectShow进行摄像头视频采集,并详细阐述了两种视频压缩方法:通过x264帧级压缩和利用系统自带编码器。在实现过程中,涉及枚举摄像头、初始化图构建器、截图抓取、设置输出Graph以及编码Filter的设计。通过不同方法,实现实时视频压缩和录制。
摘要由CSDN通过智能技术生成

最近使用directshow 做了一个摄像头视频的采集模块,录制视频后同步进行压缩,主要有两种压缩方法,一种是调用x264进行每一帧数据的压缩,一种是创建一个Filter进行压缩。记录下主要的实现过程。

首先,枚举当前支持的摄像头详细信息,主要是通过枚举设备信息,然后返回每个设备的描述信息给用户界面:

	static TCHAR ** EnumAllDevices(int *num)
	{
		CoInitialize(NULL);
		int nCaptureDeviceNumber = 0; //Device Count
		TCHAR **pCapDeviceName = (TCHAR **)malloc(10 * sizeof(TCHAR *));//先初始化二维数组的行
		for (int i = 0; i<10; i++)//再初始化二维数组的列
			pCapDeviceName[i] = (TCHAR *)malloc(MAX_PATH * sizeof(TCHAR));


		ICreateDevEnum *pDevEnum;
		IEnumMoniker   *pEnumMon;
		IMoniker	   *pMoniker;
		HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,
										IID_ICreateDevEnum,(LPVOID*)&pDevEnum);
		if (SUCCEEDED(hr))
		{
			hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumMon, 0);
			if (hr == S_FALSE)
			{
				hr = VFW_E_NOT_FOUND;
				return 0;
			}
			pEnumMon->Reset();
			ULONG cFetched;
			while(hr=pEnumMon->Next(1,&pMoniker,&cFetched),hr == S_OK)
			{
				IPropertyBag *pProBag;
				hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(LPVOID*)&pProBag);
				if (SUCCEEDED(hr))
				{
					VARIANT varTemp;
					varTemp.vt = VT_BSTR;
					hr = pProBag->Read(L"FriendlyName",&varTemp,NULL);
					if (SUCCEEDED(hr))
					{
						StringCchCopy(pCapDeviceName[nCaptureDeviceNumber],MAX_PATH,varTemp.bstrVal);
						wprintf(L"[%d] %s\n", nCaptureDeviceNumber, p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值