c# - 如何使用 WPFMediaKit 加载和播放视频而不会出现故障?
问题描述
我正在尝试编写一个旋转内容的媒体播放软件。该程序使用 WPFMediaKit.dll 和 DirectShowLib-2005.dll。在我将标志发送到屏幕之前,我加载了一些媒体,MediaOpened 事件处理程序将其暂停,稍后会调用播放。后来,当我不需要该媒体时,我将其关闭并删除。当我再次需要它时,我会再次加载。它工作了几个小时。有时它不加载视频,但后来正确加载,但我不知道为什么。1-2小时后内存使用约4GB,尝试加载视频,但每次加载都不成功。内容似乎没有播放,并且从未调用过 MediaOpened 事件。怎么了?这些是与媒体使用相关的一些代码。当一切正常时,它运行良好,内存使用量在很宽的区间内不断变化(400 到 5000MB)。当我停止播放(但程序正在运行)时,内存使用量减少到 200MB 以下。在它出错并且我停止播放后,内存使用量并没有减少。我使用的典型视频分辨率约为 5000 x 400 像素。
我如何加载视频:(Video_playing 是一个使用 WPFMediaKit.DirectShow.MediaPlayers 和 WPFMediaKit.DirectShow.Controls 的自己的类)
Video_playing video = new Video_playing(fname);
video.Width = 100;
video.Height = 20;
video.Name = "media";
video.MediaOpened += Video_MediaOpened;
mediasListBox.Items.Add(video);
媒体打开功能:
private void Video_MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
if(enablePause)
for (int i = 0; i < mediasListBox.Items.Count; i++)
{
if (sender.Equals(mediasListBox.Items[i]))
{
((Video_playing)mediasListBox.Items[i]).Pause();
}
}
}
我如何删除和关闭未使用的内容:
if (mediasListBoxInfo[i][1].Equals("media"))
{
((Video_playing)mediasListBox.Items[i]).MediaOpened -= Video_MediaOpened;
((Video_playing)mediasListBox.Items[i]).UnloadedBehavior = WPFMediaKit.DirectShow.MediaPlayers.MediaState.Close;
((Video_playing)mediasListBox.Items[i]).Close();
}
mediasListBoxInfo.RemoveAt(i);
mediasListBox.Items.RemoveAt(i);
解决方案
推荐阅读
- c# - 是否可以在 unity2d tilemaps colliders 2d 中只制作盒子对撞机
- python - 如何在 Python 中迭代文件、执行操作然后重命名它们?
- kubernetes - 如何对与 Kubernetes 服务的通信进行故障排除
- android - 如何在 RxAndroid 中将 Observable 映射到 Single?
- sql - 如何在 Oracle Data Integrator 12c 中将字符串字段拆分为多行
- node.js - 无法连接到 mongodb。无法连接到 MongoDB Atlas 集群中的任何服务器
- matlab - Matlab 如何计算大内核的双三次插值内核?
- c++ - 使用 OpenMP 的 Gauss Seidel | 线性方程求解
- arrays - 将公式转换为数组 google Sheet
- intellij-idea - 运行 Ubuntu 20.04 (IntelliJ) 的 Thinkpad 笔记本电脑上的 Ctrl+/ 快捷键?