WPF MediaElement 的奇怪行为

Posted

技术标签:

【中文标题】WPF MediaElement 的奇怪行为【英文标题】:Strange behavior with WPF MediaElement 【发布时间】:2011-07-16 07:44:07 【问题描述】:

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

如您所见,我在加载音频之前尝试将源属性设为空,但无济于事。我设法想出了一个解决方法的肮脏黑客。这涉及将源设置为一个可能会失败的文件(应用程序的 .exe)并在应用程序初始化时播放它。这允许加载的第一个音乐文件正常播放。

以前有没有其他人遇到过这种情况?有什么解决办法吗?

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

【问题讨论】:

不会对此感到愚蠢——ScrubbingEnabled 旨在适用于所有媒体,而不仅仅是流媒体。我在这个控件中遇到了很多怪癖(阅读:错误)。它有很多成熟的工作要做。 【参考方案1】:

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

【讨论】:

遇到了同样的问题,但上下文不同:故事板中有两条 MediaTimelines,SlipBehavior="Slip"。如果 MediaTimelines 所针对的两个 MediaElement 是视频并且 ScrubbingEnabled = true,它们将立即同步。如果这两个 MediaElement 是具有 ScrubbingEnabled = true 的 wav 文件,那么一个会立即加载,而另一个似乎会延迟加载,直到 Storyboard 达到该元素的持续时间标记;但是,当 ScrubbingEnabled = false 时,两个音频文件都已正确加载和同步。

以上是关于WPF MediaElement 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中播放声音?

WPF 媒体播放器(MediaElement)使用实例(转)

WPF中MediaElement的Source问题

WPF中的MediaElement从流中播放视频?

WPF MediaElement.Position属性

sprite Kit的奇怪行为