我使用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;涂抹"的随机发生,捕获被破坏了。总是发生在框架的下半部分:
我已经在网上看到其他几个人最近报告了这个问题,但最近的情况是去年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
这在我的代码中显示得很好,但是显着降低的帧速率对我的应用程序不起作用。我非常感谢解决此问题的任何提示。感谢。
答案 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();