在 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 指向的项目不存在,某些东西会抛出异常,但没有抛出任何东西,即使我给它一个虚假的文件名也是如此。
您需要执行以下操作才能播放您的媒体元素。
您的资源文件应设置为“复制到输出目录”
值设置为“Copy if newer”或“Copy always”。做对
单击您的资源文件转到属性并将复制到输出目录值设置为将 always 和 Build action 复制到
内容
您的播放器 (MediaElement) 应该添加到视图的某处 xaml
树。我不知道你的 RequestPlayer 方法正在添加
mediaEelement 查看 xaml 与否。例如
layoutRoot.Children.Add(玩家)
您需要注册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();
});
}
希望这对您有所帮助...
我的应用程序中 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 指向的项目不存在,某些东西会抛出异常,但没有抛出任何东西,即使我给它一个虚假的文件名也是如此。
您需要执行以下操作才能播放您的媒体元素。
您的资源文件应设置为“复制到输出目录” 值设置为“Copy if newer”或“Copy always”。做对 单击您的资源文件转到属性并将复制到输出目录值设置为将 always 和 Build action 复制到 内容
您的播放器 (MediaElement) 应该添加到视图的某处 xaml 树。我不知道你的 RequestPlayer 方法正在添加 mediaEelement 查看 xaml 与否。例如 layoutRoot.Children.Add(玩家)
您需要注册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();
});
}
希望这对您有所帮助...