在W10通用应用程序中播放Assets文件夹中的音频

时间:2016-01-09 23:33:18

标签: c# .net windows windows-10 win-universal-app

我的应用程序在Assets / Audio下有几个.wav和.mp3文件,我正在尝试在UI中点击某些内容时播放它们。我编写了以下代码(文件名硬编码用于测试目的),但是当触发该功能时,没有声音播放。如果我替换尝试从文件播放到播放由Windows.Media.SpeechSynthesis.SpeechSynthesizer创建的音频流,一切正常。

 private async void SoundItem_Tapped(object sender, TappedRoutedEventArgs e)
    {
        ListViewItem soundItem = sender as ListViewItem;

        if (soundItem.IsSelected)
        {
            Uri sourceUri = new Uri(String.Format("ms-appx:///Assets/Audio/151Cry.wav", UriKind.Absolute));

            await PlayAudio(sourceUri, soundItem);
        }
        else if (inUsePlayers.ContainsKey(soundItem))
        {
            MediaElement player = inUsePlayers[soundItem];
            player.Stop();
            inUsePlayers.Remove(soundItem);
            players.Enqueue(player);
        }
        else
        {

        }
    }

    private async Task PlayAudio(Uri sourceUri, ListViewItem soundItem)
    {
        MediaElement player = RequestPlayer(soundItem);

        player.Source = sourceUri;
        player.IsLooping = true;

        await player.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            player.Stop();
            player.Play();
        });
    }

这是树中文件的位置:

enter image description here

除了将声音文件拖入项目之外,我还没有做任何事情。也许他们需要添加到资源文件或复制到输出文件夹?我期望如果URI指向的项目不存在,某些内容会抛出异常,但是即使我给它一个伪造的文件名,也没有抛出任何内容。

1 个答案:

答案 0 :(得分:4)

您需要做以下事情来播放媒体元素。

  1. 您的资源文件应设置为" 复制到输出目录" 值为" 如果更新则复制"或" 始终复制"。这样做是对的 点击您的资源文件转到属性并将复制到输出目录值设置为始终复制构建行动内容

  2. 您的播放器(MediaElement)应添加到View xaml的某处 树。我不知道你的RequestPlayer方法正在添加 mediaEelement是否可以查看xaml。例如 layoutRoot.Children.Add(播放器)

  3. 您需要注册 Player_MediaOpened 事件才能播放 音频文件。如果你打电话'玩'在玩家开放媒体之前 不播放声音...如果你想要的话,如果有任何事情发生 对你的玩家不玩而不是注册 Player_MediaFailed 它 会告诉你它被提交的原因。

  4. 这是代码。

      private async Task PlayAudio(Uri sourceUri, ListViewItem soundItem)
        {
            MediaElement player = RequestPlayer(soundItem);
            player.IsLooping = true;
            player.AutoPlay = false;
            player.MediaOpened += Player_MediaOpened;
            player.MediaFailed += Player_MediaFailed;
            player.Source = sourceUri;
            player.IsLooping = true;
            //Add media element to xaml tree if not added by your RequestPlayer Method..
            this.LayoutRoot.Children.Add(player);
    
        }
    
        private void Player_MediaFailed(object sender, ExceptionRoutedEventArgs e)
        {
    
        }
    
        private async void Player_MediaOpened(object sender, RoutedEventArgs e)
        {
            await player.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                player.Play();
            });
        }
    

    希望这会有所帮助......