IP摄像头流错误

时间:2011-08-09 07:02:04

标签: c#

我有一台三星IP摄像头,我希望将其流入我的c#程序,但是当我运行该程序时,我收到了“无效参数”错误。

 private void button1_Click(object sender, EventArgs e) { while (true) {     

        string  sourceURL = url; byte[] buffer = new byte[100000];
        int read, total = 0;
        // create HTTP request
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sourceURL);
        req.Credentials = new NetworkCredential("admin", "4321");
        // get response
        WebResponse resp = req.GetResponse();
        // get response stream
        Stream stream = resp.GetResponseStream();
        // read data from stream
        while ((read = stream.Read(buffer, total, 1000)) != 0)
        {
            total += read;
        }

        Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total));
        pictureBox1.Image = bmp;
    }
}

可能是什么问题?

3 个答案:

答案 0 :(得分:1)

您没有构建正确的缓冲区,每次有新数据时都会使用新缓冲区覆盖旧缓冲区,想要修复它:

List<byte> fullData = new List<Byte>();

while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)//also > 0 not == 0 because of it can be -1
{
    fullData.AddRange(new List<Byte>(buffer).GetRange(0, read));//only add the actual data read
}

byte[] dataRead = fullData.ToArray();

Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(dataRead , 0, dataRead.Lenght));

答案 1 :(得分:0)

我的猜测(因为你没有指出错误)是图像已经超过100,000个字节,你的代码根本没有处理。我会,而是:

byte[] buffer = new byte[10 * 1024];
...
using(var ms = new MemoryStream())
{
    // read everything in the stream into ms
    while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        ms.Write(buffer, 0, read);
    }
    // rewind and load the bitmap
    ms.Position = 0;
    Bitmap bmp = (Bitmap)Bitmap.FromStream(ms);
    pictureBox1.Image = bmp;
}

答案 2 :(得分:0)

相对于问题的时间,有点迟到;但是,既然我正在寻找类似的问题而且这显然没有得到解答,我就加上我的两分钱......

我认为这里有两个问题:

首先:

您不希望将按钮单击的事件处理程序置于无限循环中。这应该是某种类型的线程,以便事件处理程序可以返回。

第二

正如另一条评论中所提到的,您的代码期望响应是某种类型的原始图像,而且很可能不是。你的相机可能最终发送MJPG,但这并不意味着它是原始的。有时您必须将其他命令发送到相机,然后当您实际开始获取MJPG流时,您必须解析它并在将图像的一部分发送到某个图片框之前提取标题。您可能正在从相机获取某种html响应(就像我一样),当您尝试将该数据传递给期望数据为某种图像格式(可能是JPEG)的方法时,您将获得无效参数错误。

不能说我知道如何解决问题因为它取决于相机。如果这些相机有某种标准接口我肯定想知道它是什么!无论如何,HTH ......