WPF MediaElement的奇怪行为

本文关键字:MediaElement WPF | 更新日期: 2023-09-27 18:02:34

我目前使用MediaElement来播放各种不同的文件,我似乎有它的大部分工作。

我注意到的一件事是音频文件(在这种情况下,特别是mp3)拒绝播放第一次尝试。有时你能听到一毫秒(非常不吸引人)的声音。更像是一闪而过,然后就没了。任何随后加载音乐的尝试都可以正常工作,奇怪。视频将在第一次尝试时播放,流媒体也是如此。这似乎只适用于本地音频文件。

启动音频和视频文件的代码几乎相同。

private void lvVideos_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    {
        var depObj = e.OriginalSource as DependencyObject;
        if (depObj != null)
        {
            var parent = depObj.FindVisualAncestor<ListViewItem>();
            if (parent != null && lvVideos.SelectedItem != null)
            {
                State = PlayState.Closed;
                Video video = lvVideos.SelectedItem as Video;
                if (video == null) return;
                lblTrackName.Text = video.Title;
                MediaPlayer.Source = null;
                MediaPlayer.Source = new Uri(video.Location);
                CurrentMedia = MediaType.Video;
                State = PlayState.Playing;
            }
        }
    }
    private void lvMusic_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    {
        var depObj = e.OriginalSource as DependencyObject;
        if (depObj != null)
        {
            var parent = depObj.FindVisualAncestor<ListViewItem>();
            if (parent != null && lvMusic.SelectedItem != null)
            {
                State = PlayState.Closed;
                Music song = lvMusic.SelectedItem as Music;
                if (song == null) return;
                lblTrackName.Text = song.Title;
                MediaPlayer.Source = null;
                MediaPlayer.Source = new Uri(song.Location);
                CurrentMedia = MediaType.Music;
                State = PlayState.Playing;
            }
        }
    }

正如你所看到的,我试图在加载音频之前将source属性设置为null,但无济于事。我已经设法想出了一个肮脏的破解方法。这涉及到将源设置为一个注定会失败的文件(应用程序的。exe),并在应用程序初始化时播放它。这允许第一个音乐文件加载正常播放。

有其他人以前遇到过这个吗?有什么解决办法吗?

编辑:天哪,我觉得自己很蠢。显然,罪魁祸首是mediaElement。ScrubbingEnabled = true;(根据文档)这是一个看似有用的选项,也许它应该只对远程流启用?

WPF MediaElement的奇怪行为

显然罪魁祸首是mediaElement。ScrubbingEnabled = true;(根据文档)这是一个看似有用的选项,也许它应该只对远程流启用?