2016-11-04 77 views
1

所以我试图循环背景音乐在我的UWP应用程序,我有一类叫做soundControl来处理音乐和声音是这样的:的MediaElement被拒绝循环

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事件,当音乐结束。

这里的任何帮助将不胜感激。 感谢

回答

2

MediaPlayer

Windows.Media.Playback.MediaPlayer是不要求要在XAML视觉树recommended player for 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(); 
} 

您可以使用XAML甚至MediaPlayerElement显示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(); 

我创建了一个sample project for my tests on my GitHub,你可以看看它是如何实现的。应用程序中的第一个按钮附加控制和第二个负载并播放声音。你可以看到,如果你只点击第二个,声音就不会播放。

+0

感谢您的答案,但仍然没有运气,它已经与Audacity保存为WAV,试图建议将它保存为MP3仍然是同样的问题。 我注意到的是,如果我在xaml中创建mediaElement而不是在代码中,它将开始按照它应该的方式行事。 我只想看看是否有人明白为什么这是这种情况,因为我现在很好奇。 –

+0

我已经用我的发现更新了我的答案:-)。这真的是一个非常有趣的问题 –

+0

韦尔这是一个非常有趣的解释,它实际上一旦我将它添加到画布上,我非常感谢你,这个问题让我感到非常兴奋,甚至当我发现一个解决方法时我并不满意。 –