使用DirectShowLib-2005使用网络摄像头拍摄的照片和视频

时间:2015-02-23 07:22:26

标签: c# video webcam directshow directshow.net

我试图在我的c#应用程序中使用网络摄像头拍照。我发现使用DirectShowLib。经过艰苦的研究,我找到了一个如何使用网络摄像头的例子,它在屏幕上显示完美的视频,但它不能将位图图像保存在我的意愿中。

我发现拍摄照片的代码样本将是

    public Bitmap snapImage()
    {
        IVMRWindowlessControl9 windowlessCtrl = null;
        IBaseFilter vmr9 = null;
        vmr9 = (IBaseFilter)new DirectShowLib.VideoMixingRenderer9();
        DirectShowLib.IVMRFilterConfig9 filterConfig = (DirectShowLib.IVMRFilterConfig9)vmr9;
        int hr = filterConfig.SetNumberOfStreams(1);
        hr = filterConfig.SetRenderingMode(DirectShowLib.VMR9Mode.Windowless);

        windowlessCtrl = (IVMRWindowlessControl9)vmr9;
        hr = windowlessCtrl.SetVideoClippingWindow(this.PreviewWindow.Handle);
        hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox);

        IntPtr currentImage = IntPtr.Zero;

        Bitmap bmp = null;

        //this is the line in wich I have problems
        hr = windowlessCtrl.GetCurrentImage(out currentImage);

        BitmapInfoHeader structure = new BitmapInfoHeader();
        Marshal.PtrToStructure(currentImage, structure);

        bmp = new Bitmap(structure.Width, structure.Height, (structure.BitCount / 8) * structure.Width, System.Drawing.Imaging.PixelFormat.Format32bppArgb, new IntPtr(currentImage.ToInt64() + 40));

        return bmp;
    }

我得到了:"错误HRESULT E_FAIL已从调用COM组件返回"错误代码-2147467259

我找到的样本可以在此页http://www.codeproject.com/Articles/34663/DirectShow-Examples-for-Using-SampleGrabber-for-Gr

中找到

有人可以帮我拍快照吗?或者任何人都可以告诉我如何做我想做的事情(显示视频并拍摄网络摄像头的快照)

谢谢你

1 个答案:

答案 0 :(得分:0)

GetCurrentImage可能会返回E_FAIL(设计行为),直到显示真实的视频帧,这是异步发生的。要检查这一点,只需在有问题的通话前显示一个消息框,等到视频开始流式传输,关闭该框,您应该按照原先的预期进行呼叫。