DirectShow系统设备的枚举

步骤:
1.使用CoCreateInstance函数创建系统枚举器组件对象,并获得ICreateDevEnum接口;
2.使用接口方法ICreateDevEnum::CreateClassEnumerator为指定的Filter注册类型目录创建一个枚举器,并获得
IEnumMoniker接口;
3.使用IEnumMoniker接口方法枚举指定类型目录下所有设备标识
4.调用IMoniker::BindToStorage之后,可以访问设备标识的属性集,比如得到Display Name,Friendly Name等;
5.调用IMoniker::BindToOject可以将设备标识生成一个DirectShow Filter,随后调用IFilterGraph::AddFilter,
并将之加入到FilterGraph中就可以参与工作了.
下面是实现这个过程的代码:
//创建一个系统枚举组件
HRESULT hr;
ICreateDevEnum *pSysDevEnum=NULL;
hr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pSysDevEnum);
if(FAILED(hr))
{
 retuen hr;
}
//指定枚举的类型录,获得IEnumMoniker接口
IEnumMoniker *pEnumCat=NULL;
hr=pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumCat,0);
if(hr==S_OK)
{
 //使用IEnumMoniker接口枚举所有的设备标识
 IMoniker *pMoniker=NULL;
 ULONG cFetched;
 while(pEnumCat->Next(1,&pMoniker,&cFetched)==S_OK)
 {
  IPropertyBag *pPropBag;
  hr=pMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&pPropBag);
  if(SUCCEEDED(hr))
  {
   //获得Filter的Friendly Name
   VARIANT varName;
   VariantInit(&varName);
   hr=pPropBag->Read(L"FriendlyName",&varName,0);
   if(SUCCEEDED(hr))
   {
   }
   VariantClear(&varName);
   //创建Filter实例
   IBaseFilter *pFilater;
   hr=pMoniker->BindToObject(NULL,NULL,IID_IBaseFilter,(void**)&pFilter);
   pPropBag->Release();
  }
  pMoniker->Release();
 }
 pEnumCat->Release();
}
pSysDevEnum->Release();

知道了一个硬件的设备标识,我们也可以直接通过IFilterGraph2::AddSourceFilterForMoniker接口方法来
创建Filter,代码如下:
LPOLESTR strName=NULL;
IBaseFilter pSrc=NULL;
hr=pMoniker->GetDisplayName(NULL,NULL,&strName);
if(SUCCEEDED(hr))
{
 //获得IFilterGraph2接口
 IFilterGraph2 *pFG2=NULL;
 hr=pGraph->QueryInterface(IID_IFilterGraph2,(void**)&pFG2);
 if(SUCCEEDED(hr))
 {
  //根据设备标识创建一个Source Filter
  hr=pFG2->AddSourceFilterForMoniker(pMoniker,0,L"Source",&pSrc);
  pFG2->Release();
 }
 CoTaskMemFree(strName);
}
或者给定一个Filter类型目录的Display Name描述,创建一个该类型目录下第一个返回的设备标识对象.
//视频采集设备的类型目录
WCHAR szMon[]=L"@device:*:{86DBB310-5D01-11D0-BD3B-00A0C911CE86}";
IBindCtx *pBindCtx;
hr=CreateBindCtx(0,&pBindCtx);
ULONG chEaten=0;
IMoniker *pMoniker=0;
hr=MkParseDisplayName(pBindCtx,szMon,&chEaten,&pMoniker);
pBindCtx->Release();
if(SUCCEEDED(hr))
{
 pMoniker->Release();
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FFmpeg是一个开源的音视频编解码库,支持多种格式的音视频文件。除了处理音视频文件外,FFmpeg还可以通过枚举设备捕获摄像头和麦克风等外部设备的音视频流。 枚举设备是指通过程序获取系统中可用的音视频设备,例如摄像头、麦克风等。在FFmpeg中,可以使用AVFormatContext结构体中的AVDeviceInfoList来实现设备枚举。AVDeviceInfoList中包含了所有可用的设备信息,包括设备的名称、类型、ID等。 通过使用avdevice_list_input_sources函数获取AVDeviceInfoList列表,FFmpeg就可以列出当前系统中可用的音视频设备。使用AVDeviceInfoList的AVDeviceInfo结构体中的name字段可以获取设备的名称,通过调用avdevice_free_list_devices函数释放设备列表。 FFmpeg支持多种不同的设备类型,包括音频输入设备、音频输出设备、视频输入设备和视频输出设备。可以使用不同的函数来获取不同类型的设备。例如,使用avdevice_register_all函数来注册所有的设备,然后使用avdevice_list_input_sources函数来获取视频输入设备。对于音频设备,可以使用avdevice_list_input_audio_devices函数来获取输入音频设备列表。 总之,FFmpeg可以通过枚举设备获取系统中可用的音视频设备,从而开发出更加丰富的音视频应用程序。 ### 回答2: FFmpeg是一种开源的跨平台音视频处理库,支持常见的音视频格式的编解码、转换、剪辑等功能。FFmpeg可以对多种输入源进行处理,其中包括设备。FFmpeg能够识别电脑上连接的设备,如摄像头和麦克风等,并把它们作为输入源。 枚举设备是FFmpeg中一种操作,其目的是列出当前电脑上可用的音视频设备,并指定对应的设备标识符。这个标识符可以作为输入源参数,用于后续的音视频处理操作。在Windows平台下,枚举设备的命令可以通过下面的命令行实现: ffmpeg -list_devices true -f dshow -i dummy 在Linux平台下,枚举设备的命令可以通过下面的命令行实现: ffmpeg -f alsa -list_devices true -i dummy 输入这些命令可以输出当前电脑上可用的音视频设备信息,可以根据输出信息中的设备标识符进行后续的音视频处理操作。FFmpeg的枚举设备功能,为用户提供了更便捷的方式来访问音视频设备,能够帮助用户更好的进行音视频录制、剪辑等操作。 ### 回答3: FFmpeg是一款开源的跨平台多媒体工具包,它提供了多种编解码库、协议库和过滤器库,可用于音视频的播放、转码、剪辑等多种操作。 在FFmpeg中,可以使用avdevice库来访问音视频设备,包括摄像头、麦克风等。avdevice库提供了一个avdevice_list_input_sources函数,用于枚举指定设备的输入源。这个函数的参数是AVInputFormat类型的指针,用来指定设备的输入格式。例如,要枚举摄像头的输入源,可以这样调用该函数: AVInputFormat *format = av_find_input_format("dshow"); AVDeviceInfoList *device_list = NULL; avdevice_list_input_sources(format, NULL, NULL); 其中,"dshow"表示DirectShow,是Windows系统下的一个视频输入方式,也可根据具体情况选择其他输入方式。 该函数将返回一个AVDeviceInfoList类型的指针,包含了输入设备的相关信息,如设备名称、设备类型等。可以遍历这个链表来获取每个输入源的详细信息,如分辨率、帧率等。 除了avdevice_list_input_sources函数,FFmpeg还提供了其他函数来打开设备、获取设备参数等操作。这些函数在使用中需要注意参数正确性和资源释放,以避免出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值