【发布时间】:2014-11-23 01:47:46
【问题描述】:
我正在开发一个显示 RTSP 视频流的 WPF 应用程序。目前,该应用程序处理与使用 RTSP 的两种设备的通信:摄像机和存档器(几乎是 DVR)。在应用程序的生命周期中,流可能而且通常会被关闭多次,因此我们需要确保在关闭它们时它们不会弄乱内存和网络。
我们尝试了 MediaElement。我们需要为 ME 安装 LAV 过滤器来显示 RTSP 流。我们可以看到来自摄像机的视频,但直到我们停止视频、在 MediaElement 上调用 Close() 并将其源设置为 null 后才释放流。该视频似乎已发布,但我们仍决定使用分析器检查内存使用情况。我们只是创建了一个循环,在该循环中我们初始化了一个新的 MediaElement(本地引用),播放 RTSP 流并在建立连接后关闭它。运行测试超过半小时,我们目睹了内存消耗的稳步增加,结果我们为我们创建的所有 MediaElement 损失了 20MB 的内存。我们仍然不知道原因(定时器被绑定到调度程序?),但在搜索互联网后,我们接受了 MediaElement 本身存在问题。
我们认为这对于我们的用例来说可以忽略不计(没有人会以这种频率创建 MediaElement)。不幸的是,当使用相同的方法时,MediaElement 没有为归档器发布流。在我们摆脱了存档器的 MediaElement 流之后,存档器的服务器仍然报告连接正在打开。
我们使用 Wireshark 分析了数据包。相机和存档器使用相同版本的 RTSP 协议,但是当我们关闭相机上的连接时,RTCP 和数据包停止发送,存档器不是这种情况。
我们决定完全放弃 ME,转而使用 VLC 播放器。当我们在 VLC 播放器上点击停止时,连接很好地关闭了,但是 VLC 有一个错误会导致在任何连接开始时重新缓冲流。这是一个已知问题:https://trac.videolan.org/vlc/ticket/9087。重新缓冲不一致。有时会发生两次,有时会发生三次。我们尝试过使用 VLC 的缓冲区设置(网络缓冲区、实时缓冲区……你说的),但没有任何帮助。
我们正在寻找许多问题的答案:
- 为什么 ME 为存档器保持连接,而不为摄像机保持连接?归档程序是否未正确处理 RTSP 终止数据包?
- 哪个组件负责在客户端保持连接打开,我们如何才能解决它(终止流)?
- 如何防止 VLC 在建立连接后重新缓冲流?
您是否在应用程序中没有性能/内存问题的情况下流式传输多个 RTSP 流是否成功?您使用了哪些组件?
旁注:我们还使用了 MediaPlayerHQ,它的表现很好,除非我们终止进程。如果我们这样做,流将保持打开几分钟。
我将不胜感激任何提示和建议!
【问题讨论】:
标签: wpf video-streaming vlc rtsp mediaelement