C# WPF中没有WAV和MediaPlayer音频
我正在尝试将背景音乐添加到我的WPF程序中。我还想在背景音乐上增加一些声音。我尝试使用C# WPF中没有WAV和MediaPlayer音频,c#,wpf,audio,C#,Wpf,Audio,我正在尝试将背景音乐添加到我的WPF程序中。我还想在背景音乐上增加一些声音。我尝试使用SoundPlayer,但是,它一次只能播放一段音频 我现在尝试使用MediaPlayer,但无法播放任何音频。这是我的密码: 在myShellViewModel中,我启动背景音乐: Sounds.StartBackgroundMusic() 在我的声音课上,我有以下几点: private static MediaPlayer _backgroundMusic = new MediaPlayer(); pu
SoundPlayer
,但是,它一次只能播放一段音频
我现在尝试使用MediaPlayer
,但无法播放任何音频。这是我的密码:
在myShellViewModel
中,我启动背景音乐:
Sounds.StartBackgroundMusic()
在我的声音课上,我有以下几点:
private static MediaPlayer _backgroundMusic = new MediaPlayer();
public static void StartBackgroundMusic()
{
_backgroundMusic.Open(new Uri("pack://application:,,,/Assets/Sounds/backgroundmusic.wav"));
_backgroundMusic.MediaEnded += new EventHandler (BackgroundMusic_Ended);
_backgroundMusic.Play();
}
private static void BackgroundMusic_Ended(object sender, EventArgs e)
{
_backgroundMusic.Position = TimeSpan.Zero;
_backgroundMusic.Play();
}
因为我想让背景音乐不断循环,所以我在中使用了答案来添加
BackgroundMusic\u end
事件。有人能帮我解释一下为什么我的音频不能播放吗?我试图重现这个问题,但效果如期
我在Visual Studio中创建了一个新的WPF应用程序,并在MainWindow.xaml.cs中使用了以下代码:
using System;
using System.Windows;
using System.Windows.Media;
namespace WpfApp1
{
public partial class MainWindow : Window
{
private static MediaPlayer _backgroundMusic = new MediaPlayer();
public MainWindow()
{
InitializeComponent();
StartBackgroundMusic();
}
public static void StartBackgroundMusic()
{
_backgroundMusic.Open(new Uri(@"C:\<path-to-sound-file>\music.wav"));
_backgroundMusic.MediaEnded += new EventHandler(BackgroundMusic_Ended);
_backgroundMusic.Play();
}
private static void BackgroundMusic_Ended(object sender, EventArgs e)
{
_backgroundMusic.Position = TimeSpan.Zero;
_backgroundMusic.Play();
}
}
}
使用系统;
使用System.Windows;
使用System.Windows.Media;
命名空间WpfApp1
{
公共部分类主窗口:窗口
{
私有静态MediaPlayer_backgroundMusic=新MediaPlayer();
公共主窗口()
{
初始化组件();
StartBackgroundMusic();
}
公共静态无效StartBackgroundMusic()
{
_backgroundMusic.Open(新Uri(@“C:\\music.wav”);
_backgroundMusic.MediaEnded+=新事件处理程序(backgroundMusic_Ended);
_背景音乐。播放();
}
私有静态无效背景音乐\u结束(对象发送方,事件参数e)
{
_backgroundMusic.Position=TimeSpan.Zero;
_背景音乐。播放();
}
}
}
您是否尝试使用“常规”文件路径来加载声音文件而不是
pack://...“
?当我使用错误的路径时,我没有收到任何声音,也没有错误消息或异常。因为我不能使用MediaPlayer
播放嵌入式资源,SoundPlayer
一次只能播放一个声音,我使用了它们的组合,并将嵌入式背景音乐资源保存到磁盘,以便MediaPlayer
可以播放它。我为此写了一个博客
以下是我所做的:
我设置了我的声音播放器,因为这是其中最简单的一个。我使用嵌入式资源创建了一个新的SoundPlayer对象
private static readonly SoundPlayer _soundOne = new SoundPlayer(WPF.Properties.Resources.soundOne);
现在是MediaPlayer
。我确保我的音频文件被设置为Visual Studio中文件属性中的构建操作下的嵌入式资源。完成此操作后,我们可以创建将嵌入的WAV文件保存到磁盘上%temp%位置的方法:
public static void SaveMusicToDisk(){
//This sets up a new temporary file in the %temp% location called "backgroundmusic.wav"
using (FileStream fileStream = File.Create(Path.GetTempPath() + "backgroundmusic.wav")){
//This them looks into the assembly and finds the embedded resource
//inside the WPF project, under the assets folder
//under the sounds folder called backgroundmusic.wav
//PLEASE NOTE: this will be different to you
Assembly.GetExecutingAssembly().GetManifestResourceStream("WPF.Assets.Sounds.backgroundmusic.wav").CopyTo(fileStream);
}
}
我们通过创建一个新的MediaPlayer对象并使用临时文件位置播放音频来播放:
//Create a new MediaPlayer object
private static readonly MediaPlayer _backgroundMusic = new MediaPlayer();
public static void StartBackgroundMusic(){
//Open the temp WAV file saved in the temp location and called "backgroundmusic.wav"
_backgroundMusic.Open(new Uri(Path.Combine(Path.GetTempPath(), "backgroundmusic.wav")));
//Add an event handler for when the media has ended, this way
//the music can be played on a loop
_backgroundMusic.MediaEnded += new EventHandler(BackgroundMusic_Ended);
//Start the music playing
_backgroundMusic.Play();
}
我的BackgroundMusic_Ended方法如下所示,只是确保音乐完成后始终重新启动:
private static void BackgroundMusic_Ended(object sender, EventArgs e){
//Set the music back to the beginning
_backgroundMusic.Position = TimeSpan.Zro;
//Play the music
_backgroundMusic.Play();
}
然后,我不得不担心在程序关闭时处理对象和清理临时文件。我没有尝试使用系统路径,因为我只能真正使用应用程序路径。这是一个WPF表单,我希望人们能够在任何计算机上运行,而不必费心创建临时文件,比如:)你知道我如何使用应用程序路径吗?你能在开发环境中尝试使用音频文件的系统路径吗?我认为尝试确认这是您系统上的问题是一个好主意。至于应用程序路径,也许这个问题可以帮助您:系统文件在开发中工作得很好。是否有任何方法可以将嵌入式资源与MediaPlayer一起使用,或者是否需要将wav文件临时存储到磁盘?根据Media Player的说法,它不支持嵌入式资源。第二个答案提供了从流中读取WAV文件的解决方案。