使用LIbVLCSharp顺序播放多个视频会导致内存增加很多



播放播放列表大约两天后,内存从大约100兆增加到几gb。线程数保持不变,约为20个线程。我从mediaplayer元素中处理媒体(当更改为新媒体时),如下所示:

if(web.MediaPlayer.Media != null) {
web.MediaPlayer.Media.Dispose();
}

web.MediaPlayer.Media = media;

和创建新媒体播放器时:

if(web.MediaPlayer != null) {
if(web.MediaPlayer.Media != null) {
web.MediaPlayer.Media.Dispose();
}
web.MediaPlayer.Dispose();
}
web.MediaPlayer = new MediaPlayer(media) { EnableHardwareDecoding = true };

这样处理媒体足够了吗?

当到达end i播放下一个媒体时,像这样调用init video调用第一段代码。在媒体播放器中切换媒体。

web.MediaPlayer.EndReached += (s, e) => ThreadPool.QueueUserWorkItem(_ => { 
if(this.tab_objects.ContainsKey(tab_index)) {
tab tab_object = this.tab_objects[tab_index];
string next_media = tab_object.get_next_media();
....some other code....
if(next_media != null) {
this.init_video(next_media, tab_index, true);
} else {


}
}
});

任何帮助都是感激的。

我已经改变了代码,没有结果:

using(Media media = new Media(this.lib_vlc, uri)) {
using(MediaPlayer p = web.MediaPlayer) {
if(p != null) {
/*using(Media last_media = p.Media) {
if(last_media != null) {
last_media.Dispose();
}
}*/
}   
web.MediaPlayer = null;
if(p != null) {
p.Dispose();
}
web.MediaPlayer = new MediaPlayer(media) { EnableHardwareDecoding = true };
media.Dispose();
}
}

我已经注释掉了"last_media"部分原因是它没有效果。我织网了。MediaPlayer为空,因为在将MediaPlayer对象设置为其他内容之前,它会导致崩溃。

我会用"明确地处理掉它就足够了。但是内存使用仍然在攀升。处置最后播放的媒体对象的正确方法是什么?

调用MediaPlayer。Media调用获取媒体的本机函数,并创建Media的新实例。每次调用属性时,你都会得到一个新实例。从c#方面来看,这并不是一个真正的问题,因为所有这些实例都将被垃圾收集,但它们并没有被正确地处理。本机get媒体函数在内部递增一个引用计数器,当调用Dispose时该引用计数器递减。

如果你调用N次MediaPlayer。媒体,你增加了N倍的ref计数器,但当你调用Dispose时只释放它一次。

另一个相关的注意事项:当你将一个媒体传递给媒体播放器时,你可以(如果你不重用它,可能应该)立即处理它(即减少引用计数,让libvlc成为唯一的引用使用)

编辑:澄清一下,而不是在MediaPlayer上进行操作。媒体,您应该存储属性的结果,并在使用完后将其丢弃

最新更新