rt,而且还判断下电脑是否有摄像头,貌似这个还比较好判断.
用WM_CAP_DRIVER_GET_CAPS这个消息.
最好不要说某个组件可以,然后就完了,我知道dspack可以.
我想知道自己怎么弄

解决方案 »

  1.   

    通過 攝像頭的 端口是否被占用 來判斷var
      ErrorCode : integer;
      SockAdd_In : TSockAddrIn;
    begin
      SockAdd_In.sin_family := PF_INET;
      SockAdd_In.sin_port := htons(FPort);//端口
      SockAdd_In.sin_addr.S_addr := htonl(INADDR_ANY);//監聽本機所有地址的端口
      ErrorCode := bind(FSock,SockAdd_In,sizeof(SockAdd_In));//返回錯誤WSAEADDRINUSE 表示使用中
    詳細錯誤代碼參考 bind的api 說明
      

  2.   

    var 
        m_Pmc : IMediaControl;
      m_pGraph ,m_pVideo: IGraphBuilder;
      m_pMS : IMediaSeeking;
        m_pVCamRenderer ,p_VCamTrans: IBaseFilter;
        MediaSeeking: IMediaSeeking;
        MediaPosition: IMediaPosition;
        Duration,CurrentPos : int64;
        VideoWindow:IVideoWindow;
    //    m_pConfig : IVCamRenderConfig;  //接口变量
        m_pCamTranconfig :IVCamTransConfig;
        Playing ,IsOver,IsOpenFile: Boolean;
        pControl : IMediaControl; //用户命令接口,用来控制过滤器容器
        pEvent : IMediaEvent;  //过滤器容器事件接口
    begin
     PM := nil; pbc := nil;
    hr := CoCreateInstance(CLSID_SystemDeviceEnum, nil,
    CLSCTX_INPROC_SERVER, ICreateDevEnum, pCreateDevEnum);//创建枚举器组件
      if(hr<0) then exit;
    // 为指定的类型目录创建一个枚举器
    hr := pCreateDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0);
    if(hr<0) then exit;
    if (pEnum <> nil) then
      begin
        PEnum.Reset;
    i :=0;
    while (pEnum.Next(1, pM, cFetched) = S_OK) do  //枚举每一个IEnumMoniker
        begin
      pM.BindToStorage(nil, nil, IPropertyBag, pBag);
      VariantInit(varName);
    pBag.Read('FriendlyName', varName, nil);//设备名称
      if (idx = i) then   //返回设备的名称
    break
          else
          begin
            Inc(i);
          end;
    end;
    end;
      pEnum := nil;
    pCreateDevEnum := nil;
    // we found it
    if (pM <> nil) then
      begin
        pBuilder := nil;
        pCapSrcFilter := nil;
    CreateBindCtx(0, pbc);
      pM.BindToObject(pbc, nil, IBaseFilter, pCapSrcFilter);//生成绑定到设备上的filter
        pbc := nil;
        eid := 0;
        Test:= 'bright[-255..255]={100}, contrast[0..32]={10}';
        CoCreateInstance(CLSID_CaptureGraphBuilder2, nil,CLSCTX_INPROC_SERVER, ICaptureGraphBuilder2, pBuilder);
        CoCreateInstance(CLSID_FilterGraph, nil,CLSCTX_INPROC, IGraphBuilder, m_pGraph);
        pBuilder.SetFiltergraph(m_pGraph);//将其添加到FILTER管理器中
    //   m_pGraph.AddFilter(m_pVCamRenderer, 'Renderer');
        m_pGraph.AddFilter(pCapSrcFilter, 'Source');
        m_pGraph.QueryInterface(IID_IMediaControl, m_pMC);
        hr := pBuilder.RenderStream(nil, nil, pCapSrcFilter, nil, P_VCamTrans);//连接一个源Filter输出到下一 Filter
    //   hr := pBuilder.RenderStream(nil, nil, P_VCamTrans, nil, m_pVCamRenderer);//连接一个源Filter输出到下一 Filter
    //   if (hr<0) then Exit;
        Button3.Enabled := True;
       if (m_pMC <> nil) then
        try
          (m_pGraph as IMediaControl).Run;
          pCapSrcFilter := nil;
          pBuilder := nil;
          pCapSrcFilter := nil;
          pM := nil;
        Except
        end;
    end;这是我之前写过的一段代码,你整理一下就可以了