10

我使用 AForge 库制作了这个小程序,它将网络摄像头的实时信息显示到 PictureBox 中。

private FilterInfoCollection VideoCaptureDevices;
private VideoCaptureDevice FinalVideoDevice;

private void Form1_Load(object sender, EventArgs e)
{
   VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
   try
   {
      foreach (FilterInfo VidCapDev in VideoCaptureDevices)
      {
         comboBox1.Items.Add(VidCapDev.Name);
         comboBox1.SelectedIndex = 0;
      }
      FinalVideoDevice = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
      FinalVideoDevice.NewFrame += new NewFrameEventHandler(FinalVideoDevice_NewFrame);
      FinalVideoDevice.Start();
   }
   catch
   {
      MessageBox.Show("No camera found. Please connect your camera and click RESET.");
   }
}

        //////////////////////////////////////////////////////////////////////////////////////////

void FinalVideoDevice_NewFrame(object sender, NewFrameEventArgs e)
{
   try
    {
       pictureBox1.Image = (Bitmap)e.Frame.Clone();
    }
    catch { }
}

但我还需要从 IP 摄像机获取流。任何想法什么是获得它的最佳方式?

4

5 回答 5

17

使用来自同一个 AForge.net 的 MJPEGStream 解决了它:)

MJPEGStream stream = new MJPEGStream("http://192.168.2.5:8080/videofeed");
            stream.NewFrame += new NewFrameEventHandler(video_NewFrame);
            stream.Start();
于 2011-09-29T10:32:19.913 回答
2

IP 摄像机在 Windows 中没有特定的媒体接口/API,它们只是 LAN 上的设备。还有成百上千的模型,它们不共享通用的访问接口(甚至关闭)。

因此,首先,您必须具体说明您感兴趣的模型。

此外,一些供应商还提供了将 IP 摄像机作为多媒体设备公开的附加“驱动程序”,例如“IP 摄像机的 DirectShow 驱动程序”。在大多数情况下,这些是特定于供应商的,不适用于其他相机。

下一个机会是相机实现了一个众所周知的流协议,在这种情况下,一些通用驱动程序也可以正常工作。

或者,只要你是 C# 的人,你可以检查 IP 摄像机的 HTTP/CGI API 并在代码中自己实现流式传输,通过与设备的 HTTP/TCP/UDP 连接发送和接收数据。

于 2011-09-29T09:31:05.560 回答
2

我曾经使用过directShow.net 库。它使您可以访问 DirectShow 的大部分功能,其中之一就是 Capturing。如果您可以将 ip 网络摄像头与 DirectShow 一起使用,您也可以在您的程序中使用它。

于 2011-09-29T09:32:39.653 回答
2

我和你一样也有同样的问题,那是我最后一年的项目,使用 c# 开发或定制 Ip 摄像头解决方案。但是我浪费了很多时间浏览以获取任何用 C# 编写的可以轻松访问 ip camera 流的代码,我很快就找到了第三方 Ozeeki sdk。但这个是试用版,将近一周到期,也不会工作。或者可能是 Ozeeki 只想要他们网站的反向链接。首先,您必须限制自己选择一台相机。就我而言,我有一个海康威视网络摄像机。 只需从此处下载适用于海康威视摄像机的设备网络 SDK: http ://www.hikvision.com/en/us/download_more.asp?id=1482

解压它,您可能会在 SDK 文件夹中找到 4 个子文件夹。在“doc”文件夹中,您将找到“Device Network SDK Programming Manual”打开它并展开“Programming Guideline”树。单击 Main Procedure API Reference 或 Preview Module Procedure。在这里,您将找到所有路线图,您必须采取哪些步骤来调用函数以从摄像机获取实时流。所有函数的声明都在“基本接口定义”树中展开并一一阅读。 游戏还没有结束,只是刚刚开始; 具有所有功能的 SDk 都是用 C/C++ 非托管代码库编写的。不能添加到托管 C# 项目解决方案参考中。因此,您必须为所有用于从相机获取流的它们制作一个包装器,并从 c# 中调用它们。只需阅读文档手册它们是什么功能。在推特上关注我: https ://twitter.com/CodingVampire 祝你好运

于 2015-05-07T20:12:50.137 回答
1

Nager.VideoStream基于 ffmpeg,因此可以轻松跨平台使用。可以通过ffmpeg访问网络摄像机和网络摄像头。

PM> install-package Nager.VideoStream
var inputSource = new StreamInputSource("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov");
//var inputSource = new WebcamInputSource("Microsoft® LifeCam HD-3000");

var cancellationTokenSource = new CancellationTokenSource();

var client = new VideoStreamClient();
client.NewImageReceived += NewImageReceived;
var task = client.StartFrameReaderAsync(inputSource, OutputImageFormat.Bmp, cancellationTokenSource.Token);
//Console.ReadLine();
client.NewImageReceived -= NewImageReceived;

private static void NewImageReceived(byte[] imageData)
{
    File.WriteAllBytes($@"{DateTime.Now.Ticks}.bmp", imageData);
}
于 2020-09-23T11:10:42.137 回答