我正在使用显示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,它的行为很好,除非我们杀死这个过程。如果我们这样做,流将保持开放几分钟。
我会很感激任何提示和建议!