在 C# 中正确处理网络摄像头
本文关键字:网络 摄像头 正确处理 | 更新日期: 2023-09-27 18:32:59
我已经看到了很多用于C#的网络摄像头使用的库。但是有2个普遍问题:
- 他们使用剪贴板
- ,这也消除了用户使用剪贴板的能力。
- 除了"拍摄测试照片"之外,没有办法检测网络摄像头是否已连接,这可能会激怒用户,因为网络摄像头会闪烁。
有没有办法解决这两个问题中的任何一个?
这是我到目前为止的课程:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WebcamLibrary
{
public static class Webcam
{
private static IntPtr Handle;
public static void Start()
{
try
{
Stop();
Handle = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 0, 0);
SendMessage(Handle, 1034, 0, 0);
SendMessage(Handle, 1074, 0, 0);
}
catch { }
}
public static void Stop()
{
try
{
SendMessage(Handle, 1035, 0, 0);
Clipboard.Clear();
}
catch { }
}
public static Image CaptureFrame()
{
try
{
SendMessage(Handle, 1084, 0, 0);
SendMessage(Handle, 1054, 0, 0);
Image image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
Clipboard.Clear();
return image;
}
catch
{
return null;
}
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("avicap32.dll")]
private static extern IntPtr capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
}
}
VfW 捕获 API 非常有限,但允许您枚举设备、连接到特定设备以及将数据捕获到内存缓冲区中。
然而,它非常古老,并且在~10年前被WDM和DirectShow淘汰,也可以从C#使用。
我没有代码,但您创建一个过滤器图,添加网络摄像头设备并告诉它呈现引脚。