使用媒体播放器在 WPF 应用中播放声音



我想使用MediaPlayer在WPF应用程序中播放声音。问题是我不能像在 SoundPlayer 中那样直接从资源文件中使用该文件

SoundPlayer player = new SoundPlayer(R.testSound);

所以我用 path 听起来像这样:

mediaPlayer.Open(new Uri("../../Resources/testSound.wav", UriKind.Relative)); //working
mediaPlayer.Open(new Uri("pack://application:,,,/Resources/testSound.wav")); //not wroking

没有相对路径是否有可能做到这一点?相对路径是坏主意吗?

如果注册到 MediaFailed 事件,您将看到它返回一条消息,指出"System.NotSupportedException:媒体仅支持源站点包 URI"。

溶液

  1. 将 testsound.wav 的构建操作编辑为"内容"和"始终复制"。 这是原产地解决方案所必需的。
  2. 打开媒体播放器时,请使用"siteoforigin"包URI而不是"应用程序"。 这是工作代码:
using System;
using System.Windows;
using System.Windows.Media;
namespace SoundTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MediaPlayer mp;
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
try
{
Console.WriteLine("Dispatcher called");
mp = new MediaPlayer();
mp.MediaOpened += Mp_MediaOpened;
mp.MediaFailed += Mp_MediaFailed;
mp.Open(new Uri("pack://siteoforigin:,,,/Resources/testsound.wav"));
}
catch (Exception ex)
{
Console.WriteLine($"{ex.GetType()}: {ex.Message}n{ex.StackTrace}");
}
}
private void Mp_MediaFailed(object sender, ExceptionEventArgs e)
{
var ex = e.ErrorException;
Console.WriteLine($"MEDIA FAILED: {ex.GetType()}: {ex.Message}n{ex.StackTrace}");
}
private void Mp_MediaOpened(object sender, EventArgs e)
{
mp.Play();
Console.WriteLine("Play called");
}
}
}

最新更新