如何从IP Camera以更高的Fps抓取JPEG格式的图像

时间:2011-04-12 15:22:59

标签: c# video jpeg frame-rate ip-camera

Hy Everyone!

我在从JPEG格式的Panasonic IP摄像机中抓取图像时遇到问题,因为fps的问题始终是fps,因为fps始终保持1或2不超过它,但实际上相机支持最多30个凸轮型号是松下WV-SP302E我正在使用以下C#代码来获取图像并在我的winforms应用程序中显示它

public partial class Form1 : Form
{
    // indicates wether to prevent caching in case of a proxy server or not
    private bool preventCaching = false;                

    public Form1()
    {
        InitializeComponent();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            this.pictureBox1.Image = this.GetSingleFrame(@"http://ipaddress/SnapshotJPEG?Resolution=320x240&Quality=Standard");                
        }
    }

    /// <summary>
    /// Get a single JPEG frame from the camera
    /// </summary>
    /// <param name="source">JPEG Stream source</param>
    /// <exception cref="WebException">If the IP camera is not receable or an error is occured</exception>
    /// <exception cref="Exception">If an unknown error occured</exception>
    public Bitmap GetSingleFrame(string source)
    {
        byte[] buffer = new byte[512 * 1024];   // buffer to read stream
        HttpWebRequest req = null;
        WebResponse resp = null;
        Stream stream = null;
        Random rnd = new Random((int)DateTime.Now.Ticks);

        try
        {
            int read, total = 0;

            // create request
            if (!preventCaching)
            {
                req = (HttpWebRequest)WebRequest.Create(source);
            }
            else
            {
                req = (HttpWebRequest)WebRequest.Create(source + ((source.IndexOf('?') == -1) ? '?' : '&') + "fake=" + rnd.Next().ToString());
            }
            // set login and password                
            req.Credentials = new NetworkCredential("root", "a");                

            req.Timeout = -1;

            resp = req.GetResponse();

            // get response stream
            stream = resp.GetResponseStream();

            // loop
            do
            {
                read = stream.Read(buffer, total, 1024);

                total += read;
            }
            while (read != 0);

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

            return bmp;
        }
        catch (WebException ex)
        {
            string s = ex.ToString();
            return null;
        }
        catch (Exception ex)
        {
            string s = ex.ToString();
            return null;
        }
        finally
        {
            // abort request
            if (req != null)
            {
                req.Abort();
                req = null;
            }
            // close response stream
            if (stream != null)
            {
                stream.Close();
                stream = null;
            }
            // close response
            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync();
    }
}

我甚至使用backgrounworker组件来抓取另一个线程中的图像,但仍然是2 fps。不知道如何增加fps

4 个答案:

答案 0 :(得分:1)

自问题以来已经有一段时间了,但从那时起它仍然是一样的。

相机在流模式下提供高达每秒30帧的速度,但这并不一定适用于JPEG快照帧速率。根据相机型号,与全速流式传输相比,有效JPEG速率可能会更慢或更慢。

你几乎无法做到这一点(MPEG-4 / H.264相机通常以较低的速率发送JPEG),你的选择是:

  • 通过接收视频源(可能是RTSP等标准协议,或通过SDK或相机供应商提供的ActiveX控件的专有协议)从相机获取图像
  • 使用更合适的模型替换相机,每秒可获得更多JPEG快照

答案 1 :(得分:1)

通常,从IP摄像机查询的jpeg图像/秒通常不超过几张。如果您想要30fps的视频流,则需要查询运动jpeg之类的“视频”流,而不是快照流。

答案 2 :(得分:0)

看起来你有相当多的设置来获得该流。从那里获取分配,这样你就不会经常分配和释放会有所帮助。

一旦你有了流,读取多个帧可能会有所帮助(即从你的数据采集循环中产生位图)。仅供参考,您不应该从非gui线程调用GUI操作。使用ReportProgress发回数据。

你确定捕获是花费时间而不是显示它吗?您是否尝试删除绘图代码进行测试?

答案 3 :(得分:-1)

确保充分照亮场景。简单且有些不准确的解释是,在自动曝光模式下的数码相机会等到它们捕获到足够的光线,这在一个黑暗的场景(如夜间的黑暗房间)中使用效率低的传感器需要一段时间。在较轻的房间或白天外面试用相机,看看你的帧速率是否有所改善。