WPF MediaElement的奇怪行为

时间:2011-07-16 07:44:07

标签: c# wpf audio .net-4.0 mediaelement

我目前正在使用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;
            }
        }
    }

正如您所看到的,我尝试在加载音频之前使源属性无效。我设法想出一个解决方法的肮脏黑客。其中涉及将源设置为gaurenteed失败的文件(应用程序的.exe)并在应用程序初始化时播放它。这允许加载的第一个音乐文件正常播放。

之前有其他人遇到过这个吗?有没有修复?

编辑:omg我觉得很蠢。显然罪魁祸首是mediaElement.ScrubbingEnabled = true;哪个(通过文档)是一个看似有用的选项,也许它应该只为远程流启用?

1 个答案:

答案 0 :(得分:2)

显然罪魁祸首是mediaElement.ScrubbingEnabled = true;哪个(通过文档)是一个看似有用的选项,也许它应该只为远程流启用?