IP摄像机视频流C#传输

3

我有以下代码,但它无法正常工作。如果我在Firefox中加载并从我的摄像头流式传输,camUrl 链接可以工作,但在运行时我的 picturebox 中没有显示任何内容。你有什么想法吗?

        public Thread _camThread;
        private string camUrl = "http://my-domain-ip:2080/videostream.cgi?user=admin&pwd=password";
        public HttpWebRequest webReq;
        public WebResponse webRes;
        public Stream sr;

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (_camThread == null) _camThread = new Thread(new ThreadStart(RunCam));
            _camThread.Start();
        }

        private void RunCam()
        {
            try
            {
                webReq = (HttpWebRequest)WebRequest.Create(camUrl);
                webReq.AllowWriteStreamBuffering = true;
                webReq.Timeout = 20000;
                using (webRes = webReq.GetResponse())
                {
                    while ((sr = webRes.GetResponseStream()) != null)
                    {
                        image.Image = Image.FromStream(sr);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (_camThread.IsAlive)
            {
                _camThread.Abort();
                _camThread = null;
            }
        }

你可以尝试在 while 循环中添加 image.Refresh()。我不确定这是否有效或者是否是最佳方法,但至少你可以看到一些东西。 - Chris Dunaway
尝试过了,没有成功。 - Magic Mick
2个回答

6

看起来你的读取响应流的循环有误。你只能从一个响应中获取一个流,而它上面可能有多个图像。

很可能你不能直接将响应流传递给Image.FromStream - 图像可能以多部分响应的形式编码,使用文本分隔符分隔图像。你可以在RFC2046中了解更多关于多部分响应格式的信息。

using (webRes = webReq.GetResponse())
{
    using (sr = webRes.GetResponseStream())
    {
        // continuously read images from the response stream until error
        while (true)
        {
            try
            {
                // note: the line below probably won't work, you may need to parse
                // the next image from the multi-part response stream manually
                image.Image = Image.FromStream(sr);


                // if the above doesn't work, then do something like this:
                // var imageBytes = ParseNextImage(sr);
                // var memoryStream = new MemoryStream(imageBytes);
                // image.Image = Image.FromStream(memoryStream);
            }
            catch(Exception e)
            {
                Console.WriteLine("Aborting read from response stream due to error {0}", e);
                break;
            }
        }
    }
}

很好,正是我所需要的。 - MeTitus

1

感谢您的回复。sr = webRes.GetResponseStream() 不为空,我尝试了在图像上执行 invalidate 和 update 操作,但仍然没有显示出来。 - Magic Mick
我没有访问IP摄像头的权限,但是如果您提供一个IP摄像头的临时链接,我会尝试调试您的代码。 - mrsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接