MediaElement拒绝循环

本文关键字:循环 拒绝 MediaElement | 更新日期: 2023-09-27 18:16:18

我尝试在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(@"Assets'Sounds");
        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事件,当音乐完成。

这里的任何帮助将是最感激的。由于

MediaElement拒绝循环

MediaPlayer

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

其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上为我的测试创建了一个示例项目,你可以看看我是如何实现它的。应用程序中的第一个按钮连接控件,第二个按钮加载并播放声音。你可以看到,如果你只点击第二个,声音不会播放