MediaElement拒绝循环

所以我试图在我的UWP应用程序中循环播放背景音乐,我有一个名为soundControl的类,它可以处理音乐和声音,如下所示:

public class soundControl
{
    private static MediaElement loop = new MediaElement();
    public static async void stopLoop()
    {
        loop.Stop();
    }
    public static async void loadLoopTimeBG()
    {
         Windows.Storage.StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"AssetsSounds");
        Windows.Storage.StorageFile file = await folder.GetFileAsync("battle.wav");
        var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
        loop.AutoPlay = false;
        loop.SetSource(stream, file.ContentType);
        loop.IsLooping = true;
    }
    public static  void loopTimeBG()
    {
        loop.Play();
    }

每当我想播放这个音乐时,我都会打电话给他:

soundControl.loadLoopTimeBG();    
soundControl.loopTimeBG();

问题是它只玩一次,停下来,我不知道为什么我尝试了另一种方法,如:

loop.MediaEnded += mediaEnded;

和这样的事件处理程序:

    private static void mediaEnded(object sender, RoutedEventArgs e)
    {
        loop.Position = TimeSpan.Zero;
        loop.Play();
    }

它也不起作用,并且在调试时它甚至不会在音乐完成时触发mediaEnded事件。

任何帮助在这里将不胜感激。 谢谢


MediaPlayer

Windows.Media.Playback.MediaPlayer是推荐的UWP播放器,不需要在XAML可视化树中。

其API与MediaElement非常相似:

private static MediaPlayer _mediaPlayer = new MediaPlayer();

public static async Task PlayUsingMediaPlayerAsync()
{
    Windows.Storage.StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets");
    Windows.Storage.StorageFile file = await folder.GetFileAsync("Click.wav");
    _mediaPlayer.AutoPlay = false;
    _mediaPlayer.Source = MediaSource.CreateFromStorageFile(file);

    _mediaPlayer.MediaOpened += _mediaPlayer_MediaOpened;

    _mediaPlayer.IsLoopingEnabled = true;

}

private static void _mediaPlayer_MediaOpened(MediaPlayer sender, object args)
{
    sender.Play();
}

您甚至可以使用MediaPlayerElement在XAML中显示MediaPlayer的视觉效果。

MediaPlayer允许使用MediaPlaybackList支持循环播放,随机播放和无间隙播放的更高级播放场景。

mediaElement.SetPlaybackSource(mediaPlaybackList);

MediaElement

经过一番挖掘,似乎有两个问题。

MediaElement是基于XAML的控件(在Windows.UI.Xaml.Controls命名空间中),它似乎只有在实际连接到可视化树之后才能正常工作。 将MediaElement放置在页面上后,它将按预期工作。

其次,加载源媒体不会立即发生。 一旦设置了源,控件需要一些时间才能实际加载媒体。 为此,您可以使用MediaOpened事件,该事件一旦真正加载就会通知您。

所以代码可能看起来有点像这样:

public static async Task LoadAndPlayAsync()
{
    Windows.Storage.StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets");
    Windows.Storage.StorageFile file = await folder.GetFileAsync("Click.wav");
    var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
    loop.AutoPlay = false;
    loop.SetSource(stream, file.ContentType);
    //or simpler -
    //loop.Source = new Uri("ms-appx:///Assets/Click.wav", UriKind.Absolute);
    loop.MediaOpened += Loop_MediaOpened;
    loop.IsLooping = true;
}

private static void Loop_MediaOpened(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    //play once the media is actually ready
    loop.Play();
}

在调用LoadAndPlayAsync方法之前,您必须将控件附加到某处(例如在Grid ):

GridContainer.Children.Add(SoundController.loop);
await SoundController.LoadAndPlayAsync();

我在我的GitHub上为我的测试创建了一个示例项目,可以查看它是如何实现的。 应用程序中的第一个按钮附加控制和第二个负载并播放声音。 你可以看到,如果你只点击第二个,声音就不会播放。

链接地址: http://www.djcxy.com/p/41797.html

上一篇: MediaElement is refusing to loop

下一篇: continue playing music when app closes