所以我试图在我的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事件。
这里的任何帮助都将非常感激。 感谢
答案 0 :(得分:2)
require('dotenv').config();
const API = process.env.API ## which will store the value from .env file
MediaPlayer
是recommended player for UWP,不需要在XAML可视化树中。
其API与Windows.Media.Playback.MediaPlayer
非常相似:
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();
}
在XAML中显示MediaPlayer
的视觉效果。
MediaPlayerElement
允许使用MediaPlayer
更高级的播放方案,支持循环播放,随机播放和无间隙播放。
MediaPlaybackList
mediaElement.SetPlaybackSource(mediaPlaybackList);
经过一番挖掘后,似乎有两个问题。
MediaElement
是基于XAML的控件(在MediaElement
命名空间中),并且它似乎在它实际附加到可视树之前无法正常工作。将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
我创建了一个sample project for my tests on my GitHub,您可以查看我是如何实现它的。应用程序中的第一个按钮附加控件,第二个按钮加载并播放声音。您可以看到,如果仅单击第二个,则声音不会播放。