MediaElement拒绝循环

时间:2016-11-04 20:01:19

标签: c# uwp 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(@"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事件。

这里的任何帮助都将非常感激。 感谢

1 个答案:

答案 0 :(得分:2)

require('dotenv').config(); const API = process.env.API ## which will store the value from .env file

MediaPlayerrecommended 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,您可以查看我是如何实现它的。应用程序中的第一个按钮附加控件,第二个按钮加载并播放声音。您可以看到,如果仅单击第二个,则声音不会播放。