【问题标题】:MediaElement doesn’t release RTSP stream and VLC Player rebuffers it before stabilizing. How to display RTSP streams correctly?MediaElement 不会释放 RTSP 流,VLC 播放器会在稳定之前重新缓冲它。如何正确显示 RTSP 流?
【发布时间】: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


    【解决方案1】:

    查看https://net7mma.codeplex.com,它在内存 cpu 上非常出色。它已经在连接 1000 个客户端的情况下进行了测试,最终用户从未遇到任何额外的延迟。 Vlc 实现了与我的库的 Rtcp 同步,因此缓冲应该只发生一次。该库还应该有助于您使用媒体基础解码视频/音频。它还支持从容器文件中获取媒体信息,并将支持通过包含的 rtsp 服务器播放它们或将它们写入备用容器格式。

    代码完全由 c# 管理和编写,并在 apache 许可下发布。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多