【问题标题】:Microsoft Media Foundation Webcam Interface微软媒体基金会网络摄像头接口
【发布时间】:2012-04-11 08:58:32
【问题描述】:

我一直在开发一个 c++ 界面,以通过 Micrsoft Media Foundation 从所有类型的网络摄像头捕获图像。我已经有了一些代码,可以连接多种类型的网络摄像头,并且能够捕捉不同分辨率和格式的图像。

我知道在 WinXP 下,可以使用 Direct Show 库更改网络摄像头的不同参数(例如白平衡、曝光时间等)。不幸的是,Direct Show 库中可以轻松从网络摄像头捕获单帧的界面已从 Win7 下的 Direct Show 中删除。有人知道我如何使用 Microsoft Media Foundation 或任何其他可以与 Microsoft Media Foundation 结合的库来访问这些参数吗?

【问题讨论】:

    标签: visual-c++ video windows-7 webcam ms-media-foundation


    【解决方案1】:

    可以从 WMF 调用 DirectShow QueryInterface 方法。示例代码在Windows Media Foundation: Controlling Camera Properties 给出。 这应该可以让您设置可用的相机参数,例如焦点和白平衡等。

    HRESULT CMFVideoCaptureDlg::SetupCamera(IMFMediaSource* pCameraSource) {
        CComQIPtr<IAMCameraControl> spCameraControl(pCameraSource);
        HRESULT hr = S_OK;
        if(spCameraControl) {
            long min, max, step, def, control;
            hr = spCameraControl->GetRange(CameraControl_Exposure, &min, &max, &step, &def, &control);
            if(SUCCEEDED(hr))
                hr = spCameraControl->Set(CameraControl_Exposure, 1, CameraControl_Flags_Manual);
        }
        CComQIPtr<IAMVideoProcAmp> spVideo(pCameraSource);
        if(spVideo)
            hr = spVideo->Set(VideoProcAmp_WhiteBalance, 0, VideoProcAmp_Flags_Auto);
        return hr;
    }
    

    事实证明 Media Foundation 没有定义任何特定的接口 对于这些任务。奇怪的是,它实现了定义的接口 它的前身 DirectShow 在其媒体源上(由 IMFMediaSource 接口),当媒体源是摄像机时

    【讨论】:

    • 你能把最相关的部分复制粘贴到这里吗? ATM 无法访问代码/链接(给出 HTTP 500):(
    【解决方案2】:

    DirectShow 在 Windows 7 中仍然很好(最容易检查的是使用 Windows SDK 中的 GraphEditAMCap)。然而,Media Foundation 在早期版本的 Windows 中缺乏必要的支持。

    【讨论】:

    • 我带着与 OP(我的 MF 程序中的控制摄像头)完全相同的问题来到这里,而您的回答基本上是“您应该使用 DirectShow”。不可接受,所以我给了 -1
    • @YePhIcK:“你应该使用 DirectShow”如果你想保留文档化的功能 - 是的,到目前为止,答案仍然很好。
    • 我不会争论,因为我使用的是我在下面发布的答案中的代码,并且它按预期工作。无需摆弄图表或过滤器(这一切都在幕后)。我的代码只是看起来像普通的 MF 代码,没有散布 DirectShow 造成混乱。
    【解决方案3】:

    This article 有以下代码,它就像一个魅力!

    
    HRESULT CMFVideoCaptureDlg::SetupCamera(IMFMediaSource* pCameraSource) {
        CComQIPtr spCameraControl(pCameraSource);
        HRESULT hr = S_OK;
        if(spCameraControl) {
            long min, max, step, def, control;
            hr = spCameraControl->GetRange(CameraControl_Exposure, &min, &max, &step, &def, &control);
            if(SUCCEEDED(hr))
                hr = spCameraControl->Set(CameraControl_Exposure, 1, CameraControl_Flags_Manual);
        }
        CComQIPtr spVideo(pCameraSource);
        if(spVideo)
            hr = spVideo->Set(VideoProcAmp_WhiteBalance, 0, VideoProcAmp_Flags_Auto);
        return hr;
    }
    

    【讨论】:

      【解决方案4】:

      IAMCameraControl 和 IANVideoProcAmp 在 Windows 8 中仍然支持白平衡、平移、缩放。相机控制目前还不是 MFT 的一部分。我们必须使用 Direct Show 来做这些事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多