Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中没有WAV和MediaPlayer音频_C#_Wpf_Audio - Fatal编程技术网

C# WPF中没有WAV和MediaPlayer音频

C# WPF中没有WAV和MediaPlayer音频,c#,wpf,audio,C#,Wpf,Audio,我正在尝试将背景音乐添加到我的WPF程序中。我还想在背景音乐上增加一些声音。我尝试使用SoundPlayer,但是,它一次只能播放一段音频 我现在尝试使用MediaPlayer,但无法播放任何音频。这是我的密码: 在myShellViewModel中,我启动背景音乐: Sounds.StartBackgroundMusic() 在我的声音课上,我有以下几点: private static MediaPlayer _backgroundMusic = new MediaPlayer(); pu

我正在尝试将背景音乐添加到我的WPF程序中。我还想在背景音乐上增加一些声音。我尝试使用
SoundPlayer
,但是,它一次只能播放一段音频

我现在尝试使用
MediaPlayer
,但无法播放任何音频。这是我的密码:

在my
ShellViewModel
中,我启动背景音乐:

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文件的解决方案。