MediaElement不会释放RTSP流,VLC播放器会在稳定之前重新生成它。如何正确显示RTSP流?

时间:2014-09-28 16:08:09

标签: wpf video-streaming vlc rtsp mediaelement

我正在开发一个显示RTSP视频流的WPF应用程序。目前,该应用程序处理与使用RTSP的两种类型设备的通信:摄像机和存档器(几乎是DVR)。在应用程序的生命周期中,流可能并且通常会多次关闭,因此我们需要确保它们在关闭它们时不会使内存和网络混乱。

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

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

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

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

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

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

您是否在应用程序中没有性能/内存问题的情况下流式传输多个RTSP流?您使用了哪些组件?

旁注:除非我们终止进程,否则我们还使用了MediaPlayerHQ,它表现得很好。如果我们这样做,流将保持打开几分钟。

我将不胜感激任何提示和建议!

1 个答案:

答案 0 :(得分:0)

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

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