我有一台三星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;
}
}
可能是什么问题?
答案 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 ......