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

Play audio from Assets folder in W10 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();
        });
    }

这是文件在树中的位置:

除了把声音文件拖到项目里,我什么都没做。也许它们需要添加到资源文件或复制到输出文件夹?我预计如果 URI 指向的项目不存在,某些东西会抛出异常,但没有抛出任何东西,即使我给它一个虚假的文件名也是如此。

您需要执行以下操作才能播放您的媒体元素。

  1. 您的资源文件应设置为“复制到输出目录” 值设置为“Copy if newer”或“Copy always”。做对 单击您的资源文件转到属性并将复制到输出目录值设置为将 alwaysBuild action 复制到 内容

  2. 您的播放器 (MediaElement) 应该添加到视图的某处 xaml 树。我不知道你的 RequestPlayer 方法正在添加 mediaEelement 查看 xaml 与否。例如 layoutRoot.Children.Add(玩家)

  3. 您需要注册Player_MediaOpened活动才能玩您的 音频文件。如果您在播放器打开之前调用 'play',媒体将 不播放声音......如果你想要,如果发生任何事情 给你的播放器不玩比注册 Player_MediaFailed 它 会告诉你为什么要玩它。

这是代码。

  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();
        });
    }

希望这对您有所帮助...