抹掉/损坏的RTSP流捕获

时间:2015-05-08 14:12:54

标签: opencv rtsp emgucv capture corruption

我使用emgu cv 2.4.10来创建最终将与IP摄像头一起使用的RTSP流查看器。因为我还没有相机,我正在使用VLC(Windows GUI)测试从视频文件创建流。

:sout=#duplicate{dst=rtp{sdp=rtsp://:8554/stream},dst=display} :sout-all :sout-keep

我在localhost上进行所有测试。

这是我的捕获代码:

private void ProcessFrame(object sender, EventArgs arg) {
    try {
        frame = _capture.QueryFrame();
        pictureBox1.Image = frame.ToBitmap();
    }
    catch (Exception ex) {
        MessageBox.Show(ex.Message.ToString());
    }
}

使用此事件处理程序调用此方法:

_capture = new Capture("rtsp://localhost:8554/stream");
Application.Idle += ProcessFrame;
_capture.Start();

随着'#34;涂抹"的随机发生,捕获被破坏了。总是发生在框架的下半部分:

screencapture showing smearing on the lower half of the captured video frame

我已经在网上看到其他几个人最近报告了这个问题,但最近的情况是去年12月,但是没有找到解决办法,或者说这对我有用:

为了缩小问题范围,我从命令行运行ffplay并且捕获非常完美。我已经运行了另一个VLC实例来捕获RTSP流并且它显示完美。所以这显然是open cv / emgu cv。

中的一个问题

一时兴起,我使用HTTP将VLC更改为流。

:sout=#duplicate{dst=http{mux=ffmpeg{mux=flv},dst=:8080/stream},dst=display} :sout-all :sout-keep

这在我的代码中显示得很好,但是显着降低的帧速率对我的应用程序不起作用。我非常感谢解决此问题的任何提示。感谢。

1 个答案:

答案 0 :(得分:0)

我不知道您是否解决了问题,但我建议您不要在application.idle事件中进行处理。相反,使用线程。创建另一个线程并在其中创建您的进程。示例c#代码:

Thread t = new Thread(new ThreadStart(()=>{ while(true) {frame = _capture.QueryFrame();
        pictureBox1.Image = frame.ToBitmap();}}));  t.IsBackGround = true; t.Start();