2014-09-28 34 views
1

我正在使用显示RTSP视频流的WPF应用程序。目前,该应用程序处理与使用RTSP的两种设备的通信:摄像机和存档器(非常多的DVR)。在应用程序的整个生命周期中,数据流可能并且通常会多次关闭,因此我们需要确保它们在关闭它们时不会混乱内存和网络。MediaElement不会释放RTSP流,VLC Player会在稳定之前对其进行重新编译。如何正确显示RTSP流?

我们去了MediaElement。我们需要为ME安装LAV滤波器来显示RTSP流。我们可以看到来自摄像机的视频,但是直到我们停止视频才会释放流,在MediaElement上调用Close()并将其源设置为null。视频似乎已经发布,但我们仍然决定使用探查器来检查内存使用情况。我们只是创建了一个循环,我们在其中初始化一个新的MediaElement(本地引用),播放RTSP流并在建立连接后关闭它。运行测试超过半个小时后,我们目睹了内存消耗的稳步增长,因此我们创建了所有MediaElement,损失了20MB的内存。我们仍然不知道这个原因(定时器被绑定到调度器?),但是在搜索互联网后,我们接受了MediaElement本身存在的问题。

我们认为这对我们的用例来说可以忽略不计(没有人会用该频率创建MediaElements)。不幸的是,MediaElement在使用相同的方法时没有为归档器发布流。在我们摆脱了MediaElement的归档流后,归档器的服务器仍然报告连接正在打开。

我们用Wireshark分析了数据包。摄像机和归档器使用相同版本的RTSP协议,但是当我们关闭摄像机上的连接时,RTCP和数据包将停止传输,而归档器则不同。

我们决定放弃ME,切换到VLC播放器。当我们在VLC播放器上停止播放时,连接很好地关闭,但VLC在任何连接开始时都有一个导致重新缓冲流的错误。这是一个已知的问题:https://trac.videolan.org/vlc/ticket/9087。重建不一致。有时发生两次,有时发生三次。我们尝试使用VLC的缓冲区设置(网络缓冲区,实时缓冲区......你的名字),但没有任何帮助。

有我们正在寻找的答案,许多问题:

  • 为什么是我是保持连接活着的档案库而不是相机?归档程序是否不正确处理RTSP终止包?
  • 哪个组件负责保持连接在客户端打开,我们如何解决它(终止流)?
  • 如何防止连接建立后VLC重新缓冲流?

在应用程序中流式传输多个RTSP流而没有性能/内存问题吗?你使用什么组件?

附注:我们也玩过MediaPlayerHQ,它的行为很好,除非我们杀死这个过程。如果我们这样做,流将保持开放几分钟。

我会很感激任何提示和建议!

回答

0

退房https://net7mma.codeplex.com,它在内存cpu上优秀。它已经通过1000个连接的客户端的测试,最终用户从未经历任何额外的延迟。 Vlc实现了与我的库的Rtcp同步,所以缓冲应该只发生一次。该库还应该帮助您使用媒体基础解码视频/音频。它还支持从容器文件获取媒体信息,并支持通过附带的rtsp服务器进行播放或将其写入其他容器格式。

该代码完全由C#管理和编写,并在Apache许可证下发布。