




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[C++]DirectShow检测⾳视频输⼊设备及其采集参数创建CLR类库项⽬(CSharpDirectShow),编写托管的DirectShow类库,右键项⽬属性-->链接器-->输⼊-->附加依赖项;添加静态库⽂件Strmiids.lib和Quartz.lib;定义头⽂件CSharpDirectShow.h,包含头⽂件dshow.h,定义如下⽅法:#pragmaonce#include<dshow.h>usingnamespaceSystem;usingnamespaceSystem::Runtime::InteropServices;publicrefclassDirectShow{public:///<summary>///在当前线程上初始化COM库,并将并发模型标识为单线程单元(STA)///</summary>///<returns></returns>staticBooleanComInit();///<summary>///关闭当前线程上的COM库,卸载该线程加载的所有DLL,释放该线程维护的所有其他资源,并强制关闭该线程上的所有RPC连接///</summary>staticvoidComUinit();///<summary>///获取视频输⼊设备///</summary>///<paramname="devices"></param>///<returns></returns>staticInt32GetVideoInputDevices([Out]array<VideoInputDsDevice^>^%devices);///<summary>///获取⾳频输⼊设备///</summary>///<paramname="device"></param>///<returns></returns>staticInt32GetAudioInputDevices([Out]array<AudioInputDsDevice^>^%device);};其中,初始化COM库只能在STA线程调⽤,控制台程序直接调⽤会返回失败,在Winform和WPF等应⽤程序应该在第⼀次使⽤时初始化COM库;当前线程初始化COM库和关闭COM库:BooleanDirectShow::ComInit(){HRESULThr=CoInitialize(NULL);returnhr==S_OK||hr==S_FALSE;}voidDirectShow::ComUinit(){CoUninitialize();}1、创建视频输⼊设备的枚举器IEnumMonikerHRESULTDirectShow::EnumerateDevices(REFGUIDcategory,IEnumMoniker**ppEnum){//创建系统设备枚举器ICreateDevEnum*pDevEnum;HRESULThr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pDevEnum));if(SUCCEEDED(hr)){//为类别创建枚举数.hr=pDevEnum->CreateClassEnumerator(category,ppEnum,0);if(hr==S_FALSE)hr=VFW_E_NOT_FOUND;//类别是空的,视为错误pDevEnum->Release();}returnhr;}Int32DirectShow::GetVideoInputDevices([Out]array<VideoInputDsDevice^>^%devices){devices=nullptr;IEnumMoniker*pEnum;HRESULThr=EnumerateDevices(CLSID_VideoInputDeviceCategory,&pEnum);//创建视频输⼊设备枚举器if(FAILED(hr))returnhr;hr=EnumerateVideoInputDevices(pEnum,devices);//枚举视频输⼊设备pEnum->Release();returnhr;}2、调⽤IEnumMoniker::Next()⽅法枚举设备,调⽤IPropertyBag::Read⽅法读取设备属性,以获取设备的友好名称和设备标识字符串:HRESULTDirectShow::EnumerateVideoInputDevices(IEnumMoniker*pEnum,[Out]array<VideoInputDsDevice^>^%devices){HRESULThr=S_FALSE;devices=nullptr;List<VideoInputDsDevice^>^list=gcnewList<VideoInputDsDevice^>();IMoniker*pMoniker;while(pEnum->Next(1,&pMoniker,NULL)==S_OK){IPropertyBag*pPropBag;hr=pMoniker->BindToStorage(0,0,IID_PPV_ARGS(&pPropBag));if(FAILED(hr)){pMoniker->Release();continue;}VideoInputDsDevice^device=gcnewVideoInputDsDevice();VARIANTvar;VariantInit(&var);//获取设备友好名hr=pPropBag->Read(L"FriendlyName",&var,0);if(FAILED(hr))hr=pPropBag->Read(L"Description",&var,0);if(SUCCEEDED(hr)){device->FriendlyName=System::String(var.bstrVal).ToString();VariantClear(&var);}//获取设备Moniker名LPOLESTRpOleDisplayName=reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH*2));hr=pMoniker->GetDisplayName(NULL,NULL,&pOleDisplayName);if(SUCCEEDED(hr)){device->MonikerName=System::String(pOleDisplayName).ToString();array<VideoParams^>^params;hr=EnumerateVideoParams(pMoniker,params);//枚举设备的采集参数if(SUCCEEDED(hr))device->Params=params;}CoTaskMemFree(pOleDisplayName);list->Add(device);pPropBag->Release();pMoniker->Release();}devices=list->ToArray();returnS_OK;}3、枚举视频输⼊设备的采集参数:HRESULTDirectShow::EnumerateVideoParams(IMoniker*pMoniker,[Out]array<VideoParams^>^%params){params=nullptr;IBaseFilter*pFilter;HRESULThr=pMoniker->BindToObject(NULL,NULL,IID_IBaseFilter,(void**)&pFilter);if(FAILED(hr))returnhr;IEnumPins*pinEnum;hr=pFilter->EnumPins(&pinEnum);if(FAILED(hr)){pFilter->Release();returnhr;}List<VideoParams^>^list=gcnewList<VideoParams^>();IPin*pPins;while(pinEnum->Next(1,&pPins,NULL)==S_OK){PIN_INFOpinInfo;hr=pPins->QueryPinInfo(&pinInfo);if(FAILED(hr)||pinInfo.dir!=PINDIR_OUTPUT){pPins->Release();continue;}IEnumMediaTypes*mtEnum;hr=pPins->EnumMediaTypes(&mtEnum);if(FAILED(hr)){pPins->Release();continue;}AM_MEDIA_TYPE*mt;while(mtEnum->Next(1,&mt,NULL)==S_OK){VideoParams^param=nullptr;if(mt->formattype==FORMAT_VideoInfo){VIDEOINFOHEADER*pVih=reinterpret_cast<VIDEOINFOHEADER*>(mt->pbFormat);param=gcnewVideoParams();param->FrameWidth=pVih->bmiHeader.biWidth;param->FrameHeight=pVih->bmiHeader.biHeight;param->AverageFrameRate=pVih->AvgTimePerFrame==0?0:10000000/pVih->AvgTimePerFrame;}elseif(mt->formattype==FORMAT_VideoInfo2){VIDEOINFOHEADER2*pVih=reinterpret_cast<VIDEOINFOHEADER2*>(mt->pbFormat);param=gcnewVideoParams();param->FrameWidth=pVih->bmiHeader.biWidth;param->FrameHeight=pVih->bmiHeader.biHeight;param->AverageFrameRate=pVih->AvgTimePerFrame==0?0:10000000/pVih->AvgTimePerFrame;}if(param&¶m->AverageFrameRate>1){BooleanisExit=false;foreach(VideoParams^iteminlist){if(item->FrameWidth==param->FrameWidth&&item->FrameHeight==param->FrameHeight&&item->AverageFrameRate==param->AverageFrameRate){isExit=true;break;}}if(!isExit)list->Add(param);}}pPins->Release();}pFilter->Release();params=list->ToArray();returnS_OK;}调⽤代码及结果:varret=DirectShow.GetVideoInputDevices(outVideoInputDsDevice[]videoInputDevices);if(ret==0){Console.WriteLine("视频输⼊设备:");foreach(varvideoInputDeviceinvideoInputDevices){Console.WriteLine($"{videoInputDevice.FriendlyName}\t{videoInputDevice.MonikerName}");if(videoInputDevice.Params.Length>0){Console.WriteLine("像素宽度\t像素⾼度\t1秒平均帧数");foreach(varparaminvideoInputDevice.Params){Console.WriteLine($"{param.FrameWidth}\t{param.FrameHeig
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度电视机产品智能语音交互技术研发合同
- 2025年度土地买卖合同履行及监管规范
- 诺如知识培训方案课件
- 2025年度汽车租赁企业培训及拓展合同
- 2025年度智慧校园食堂运营管理承包合同
- 2025版涂料产品进出口代理合同标准范本
- 2025版科技园区融资中介服务合作协议范本
- 2025版新能源设备以租代售租赁协议范本
- 2025版水管材料电商平台服务条款合同
- 2025合同样本库建设与管理的规范指南
- 《医药电子商务实务》考试复习题库(含答案)
- 钢板仓施工流程及安全保证方案
- 农业互联网与农产品营销策略优化
- 知识产权具体实施细则
- 泄密案件整改报告范文
- 船舶危险源辨识及防范措施
- 严重精神障碍患者报告卡
- 空气源热泵计算
- 学员陪跑合同模板
- 钢结构大棚安拆专项施工方案
- 消化内科护士进修总结汇报
评论
0/150
提交评论