首页 > 解决方案 > 如何使用 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#wpfmedia-playerdirectshowwpf-mediakit

解决方案


推荐阅读