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事件,当音乐完成。
这里的任何帮助将是最感激的。由于
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上为我的测试创建了一个示例项目,你可以看看我是如何实现它的。应用程序中的第一个按钮连接控件,第二个按钮加载并播放声音。你可以看到,如果你只点击第二个,声音不会播放