利用DirectShow简单判断摄像头权限并预览

13 篇文章 0 订阅

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

#include "windows.h"  
#include "TCHAR.h"  
#include <dshow.h>

LRESULT CALLBACK WindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

bool IsCamerePermission()
{
    bool bRet = false;
    CoInitialize(NULL);
    IGraphBuilder *pGraph = NULL;
    ICaptureGraphBuilder2 *pBuilder = NULL;
    ICreateDevEnum *pSysDevEnum;
    IEnumMoniker *pEnumCat;
    IBaseFilter *pBaseFilter;
    IMoniker *pMoniker;
    IMediaControl *pControl = NULL;
    HRESULT hr;

    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuilder);

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
        if (SUCCEEDED(hr))
        {
            hr = pBuilder->SetFiltergraph(pGraph);
        }
    }

    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
        IID_ICreateDevEnum, reinterpret_cast<void **>(&pSysDevEnum));
    hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);


    if (pEnumCat->Next(1, &pMoniker, NULL) == S_OK)
    {
        hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pBaseFilter);
        bRet = SUCCEEDED(hr);
    }

    if (pMoniker)
    {
        pMoniker->Release();
    }
    if (pControl)
    {
        pControl->Release();
    }
    if (pGraph)
    {
        pGraph->Release();
    }
    CoUninitialize();

    return bRet;
}


int _tmain(int argc, _TCHAR* argv[])
{
    {
        if (IsCamerePermission())
        {
            std::cout << "可以访问\n";
        }
        else
        {
            std::cout << "NO NO NO\n";
        }
        system("pause");
        return 0;
    }
    IGraphBuilder *pGraph = NULL;
    ICaptureGraphBuilder2 *pBuilder = NULL;
    ICreateDevEnum *pSysDevEnum;
    IEnumMoniker *pEnumCat;
    IBaseFilter *pBaseFilter;
    IMoniker *pMoniker;
    IVideoWindow *pWindow;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
    HRESULT hr = CoInitialize(NULL);
    long pWidth;
    long pHeight;

    HINSTANCE hInstance;
    hInstance = GetModuleHandle(NULL);
    WNDCLASS Draw;
    Draw.cbClsExtra = 0;
    Draw.cbWndExtra = 0;
    Draw.hCursor = LoadCursor(hInstance, IDC_ARROW);;
    Draw.hIcon = LoadIcon(hInstance, IDI_APPLICATION);;
    Draw.lpszMenuName = NULL;
    Draw.style = CS_HREDRAW | CS_VREDRAW;
    Draw.hbrBackground = (HBRUSH)COLOR_WINDOW;
    Draw.lpfnWndProc = WindowProc;
    Draw.lpszClassName = _T("DDraw");
    Draw.hInstance = hInstance;


    RegisterClass(&Draw);

    HWND hwnd = CreateWindow(
        _T("DDraw"),           //上面注册的类名,要完全一致    
        L"绘制",  //窗口标题文字    
        WS_OVERLAPPEDWINDOW, //窗口外观样式    
        38,             //窗口相对于父级的X坐标    
        20,             //窗口相对于父级的Y坐标    
        480,                //窗口的宽度    
        250,                //窗口的高度    
        NULL,               //没有父窗口,为NULL    
        NULL,               //没有菜单,为NULL    
        hInstance,          //当前应用程序的实例句柄    
        NULL);              //没有附加数据,为NULL    

    // 显示窗口    
    ShowWindow(hwnd, SW_SHOW);

    // 更新窗口    
    UpdateWindow(hwnd);

    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return -1;
    }

    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuilder);

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
        if (SUCCEEDED(hr))
        {
            hr = pBuilder->SetFiltergraph(pGraph);
        }
    }


    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
        IID_ICreateDevEnum, reinterpret_cast<void **>(&pSysDevEnum));
    hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);


    if (pEnumCat->Next(1, &pMoniker, NULL) == S_OK)
    {
        hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pBaseFilter);
        if (SUCCEEDED(hr))
        {
            hr = pGraph->AddFilter(pBaseFilter, L"Capture Filter");
            hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pBaseFilter, NULL, NULL);
            hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pWindow);
            hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
            pControl->Run();
            pWindow->put_Owner((OAHWND)hwnd);
            pWindow->put_WindowStyle(WS_CHILD);
            pWindow->get_Width(&pWidth);
            pWindow->get_Height(&pHeight);
            pWindow->SetWindowPosition(0, 0, pWidth, pHeight);
        }
    }


    // 消息循环    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    pMoniker->Release();
    pControl->Release();
    pGraph->Release();
    CoUninitialize();
}

// 消息处理函数的实现  
LRESULT CALLBACK WindowProc(
    _In_  HWND hwnd,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DirectShow是微软开发的一套多媒体框架,用于在Windows平台上进行音频和视频的捕捉、处理和分发。UVC(USB Video Class)是一种通用的摄像头接口标准,使得摄像头可以通过USB接口与电脑连接,并且无需安装特定的驱动程序。 通过DirectShow控制UVC摄像头,首先需要创建一个DirectShow图形,并添加一个视频捕捉滤镜。然后,通过枚举设备接口获取与UVC摄像头对应的设备,并将其连接到视频捕捉滤镜。 接下来,可以设置摄像头的属性,例如分辨率、帧率、曝光等。可以使用DirectShow提供的接口查询和设置相应的属性值,以满足不同的需求。 一旦设置完成,就可以进行摄像头的捕捉和实时预览了。通过DirectShow提供的接口,可以启动和停止摄像头的捕捉,以及获取捕捉到的视频数据。 此外,还可以对捕捉到的视频数据进行处理和编码。DirectShow提供了一系列的滤镜,用于对视频数据进行处理,例如添加效果、裁剪和缩放等。可以按照需要插入相应的滤镜,并设置其参数。 最后,可以将处理后的视频数据进行分发,即将其输出到显示设备或保存为文件。对于显示设备,可以使用DirectShow提供的接口创建一个视频渲染滤镜,并将其连接到处理后的视频数据。对于保存为文件,可以创建一个文件写入滤镜,并将其连接到处理后的视频数据,即可实现视频的保存。 通过以上步骤,可以实现在Windows平台上使用DirectShow控制UVC摄像头,包括捕捉、处理和分发。DirectShow提供了丰富的接口和滤镜,使得开发人员可以灵活地控制摄像头,并实现各种操作和功能。 ### 回答2: DirectShow 是用于在 Windows 操作系统上处理音频和视频数据的框架。为了控制 UVC(USB Video Class)摄像头,我们可以使用 DirectShow 提供的接口和功能。 首先,我们需要使用 DirectShow 打开摄像头设备。这可以通过使用 DirectShow 提供的设备枚举功能来实现。设备枚举功能会列出计算机上连接的所有视频设备,并提供设备的详细信息。我们可以根据设备的标识符或名称选择特定的摄像头设备。 接下来,我们可以使用 DirectShow 提供的图形渲染器(Renderer)对象来显示摄像头捕获的图像。图形渲染器可以创建一个窗口,并将摄像头的实时视频流渲染到该窗口中。 此外,DirectShow 还提供了捕获图像的功能。我们可以使用捕获功能将摄像头的图像数据保存到图像文件中或进行其他处理。捕获图像的过程涉及创建图像采集过滤器(Capture Filter),配置图像格式和分辨率,并设置保存图像的目标文件。 除了摄像头数据的捕获和渲染,DirectShow 还提供了其他功能,如控制摄像头的参数和属性。通过 DirectShow 提供的接口,我们可以调整摄像头的亮度、对比度、饱和度等参数,以及设置摄像头的白平衡、曝光等属性。 总之,DirectShow 提供了一套完整的工具和接口,用于控制 UVC 摄像头。通过使用 DirectShow 提供的功能,我们能够打开摄像头设备,显示实时视频流,捕获图像,并控制摄像头的参数和属性。 ### 回答3: DirectShow是一个用于视频和音频捕获、处理和播放的多媒体框架。UVC(USB Video Class)是一种标准,用于支持通过USB接口进行视频捕获的设备,如摄像头。 使用DirectShow控制UVC摄像头,需要以下步骤: 1. 获取设备列表:DirectShow提供了一个接口用于获取连接到计算机的视频设备列表。可以使用该接口获取UVC摄像头的列表。 2. 选择摄像头:根据应用程序的需求,可以从设备列表中选择一个UVC摄像头。 3. 配置摄像头参数:使用DirectShow接口,可以配置摄像头的参数,如分辨率、帧率、曝光、对比度等。可以根据应用程序的需求设置适当的参数。 4. 创建图形渲染器:在DirectShow中,图形渲染器用于显示捕获到的视频流。可以使用DirectShow提供的接口创建一个图形渲染器,并将其与选定的UVC摄像头连接。 5. 捕获图像:通过DirectShow接口,可以启动UVC摄像头的捕获功能,并将捕获到的图像数据传递给图形渲染器进行显示。可以使用DirectShow提供的接口将捕获到的图像数据保存到文件或进行其他处理。 6. 停止捕获:当需要停止UVC摄像头的捕获功能时,可以使用DirectShow接口停止捕获,并释放相关资源。 通过上述步骤,可以使用DirectShow控制UVC摄像头进行视频捕获、处理和显示。DirectShow提供了丰富的接口和功能,可以满足各种应用程序的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值