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