我试图在我的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
中找到有人可以帮我拍快照吗?或者任何人都可以告诉我如何做我想做的事情(显示视频并拍摄网络摄像头的快照)
谢谢你
答案 0 :(得分:0)
GetCurrentImage
可能会返回E_FAIL
(设计行为),直到显示真实的视频帧,这是异步发生的。要检查这一点,只需在有问题的通话前显示一个消息框,等到视频开始流式传输,关闭该框,您应该按照原先的预期进行呼叫。