2016-11-04 14 views
1

Так что я пытался петлевой фоновой музыки в моей UWP App, у меня есть класс с именем 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 является recommended player for 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(); 
} 

Вы даже можете отобразить визуальные в MediaPlayer в XAML с помощью MediaPlayerElement.

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 по-прежнему той же проблемой. Я заметил, что если я создам mediaElement в xaml, а не в коде, он начнет вести себя так, как должен. Я просто хочу узнать, понимает ли кто-нибудь, почему это так, потому что мне действительно интересно. –

+0

Я обновил свой ответ своими выводами :-). Это действительно очень интересная проблема. –

+0

Welll well это очень интересное объяснение, которое на самом деле действительно работает, когда я добавляю его на холст. Большое спасибо, эта проблема заинтриговала меня так сильно, что даже когда я нашел обходной путь, я не был удовлетворен , –

 Смежные вопросы

  • Нет связанных вопросов^_^