WPF播放音频使用的SoundPlayer和MediaPlayer

WPF中,最简单最容易播放音频的方式是使用SoundPlayer类。它是.NET Framework 2.0的一部分,是对Win32 PlaySound API的封装。

         它具有以下限制:

1)仅支持.wav音频文件;

2)不支持同时播放多个音频(任何新播放的操作将终止当前正在播放的);

3)无法控制声音的音量;

下面的代码展示了如何使用SoundPlayer播放声音:

    SoundPlayer player = new SoundPlayer("BLOW.WAV");

    player.Play();

传递给SoundPlayer构造函数的字符串可以是本地的一个文件名,也可以是网络上的文件。调用Play方法将异步播放声音。如果想同步播放声音,可以使用PlaySync方法。当然,想异步循环播放,可以使用PlayLooping方法,直到你调用Stop或重新播放一个新的声音为止。

         需要说明的是,声音文件直到第一次播放时才会被加载。如果声音文件的加载需要很长的时间,例如从网络来,使用同步播放,会导致UI死掉。出于这个原因考虑,SoundPlayer类也定义了Load和LoadAsync方法以便在第一次播放之前提前加载声音文件。

         如果你想播放系统声音,但记不住他们的文件名,可以用System.Media.SystemSounds类中的一些静态属性:Asterisk,Beep,Exclamation,Hand,Question。每个类型都有自己的Play方法,用来异步播放系统声音。

 

    二、使用WPF专用的MediaPlayer类。它是基于Windows Media Player构建起来的,因此,只要是Windows Media Player支持的格式,它都能播放(包括视频)。

         MediaPlayer具有以下特性供你使用:

1)可以同时播放多个声音(创建多个MediaPlayer对象);

2)可以调整音量(Volume属性);

3)可以使用Play,Pause,Stop等方法进行控制;

4)可以设置IsMuted属性为True来实现静音;

5)可以用Balance属性来调整左右扬声器的平衡;

6)可以通过SpeedRatio属性控制音频播放的速度;

7)可以通过NaturalDuration属性得到音频的长度,通过Position属性得到当前播放进度;

8)可以通过Position属性进行Seek;

使用MediaPlayer播放音频文件如下:

    MediaPlayer player = new MediaPlayer ();

    player.Open(new Uri("BLOW.WAV", UriKind.Relative));

    player.Play();

一个MediaPlayer对象一次只能播放一个文件。而且该文件是异步播放的,你也可以调用Close来释放文件。

(提一下,MediaPlayer在XP下需要window media player比较高版本的支持,不然没有声音。SoundPlayer就不需要),这个有点略坑

 

三、使用COM组建的window media player。

看到调用的com组建足足有十几MB大小,果断放弃了,看网上其他人做的,效果应该还不错。 

 

出处:https://www.cnblogs.com/chuhaida/p/4261516.html

 

=======================================================================================

WPF中播放声音

  1. 播放系统自带声音

    在System.Media命名空间中

    SystemSounds.Asterisk.Play();
    SystemSounds.Beep.Play();
    SystemSounds.Exclamation.Play();
    SystemSounds.Hand.Play();
    SystemSounds.Question.Play();
    
  2. 使用SoundPlayer播放.wav格式的声音

    1)仅支持.wav音频文件

    2)不支持同时播放多个音频

    3)无法控制声音的音量

    4)支持同步、异步播放

    5)支持循环播放

    6)支持文件和流播放

    下面是示例:

    SoundPlayer player = new SoundPlayer("test.wav");
    player.Play();
    
  3. 使用MediaPlayer播放声音

    这个是基于Windows Media Player构建的,因此支持Windows Media Player能播放的格式。

    1)可以同时播放多个声音

    2)可以调整音量(Volume属性)

    3)可以设置IsMuted属性实现静音

    4)可以通过NaturalDuration属性得到音频的藏毒,通过Position属性得到当前播放进度

    MediaPlayer player = new MediaPlayer();
    player.Open(new Uri("test.mp3", UriKind.Relative));
    player.Play();
    
  4. 使用MediaElement播放声音

    <MediaElement Source="test.mp3" LoadedBehavior="Play"/>
    
  5. 使用mciSendString系统播放音乐

    /// <summary>
        /// 音乐播放
        /// </summary>
        public static class AudioUtil
        {
            [DllImport("winmm.dll")]
            public static extern uint mciSendString(string lpstrCommand,
           string lpstrReturnString, uint uReturnLength, IntPtr hWndCallback);
            public static uint Play(string fileName)
            {
                //mciSendString(@"close media", null, 0, IntPtr.Zero);
                mciSendString($@"open ""{fileName}"" type mpegvideo alias media", null, 0, IntPtr.Zero);
                return mciSendString("play media repeat", null, 0, IntPtr.Zero);
            }
            public static uint Stop()
            {
                return mciSendString("close media", null, 0, IntPtr.Zero);
            }
        }
    

    其中media是别名,是在open命令时使用alias指定的别名,后面停止播放时要带上这个别名。

  6. 使用NAudio第三方库播放声音

    NuGet安装NAudio

    NAudio.Wave.Mp3FileReader mp3File = new NAudio.Wave.Mp3FileReader("test.mp3");//加载音频文件
    NAudio.Wave.WaveOut waveOut = new NAudio.Wave.WaveOut();
    waveOut.Init(mp3File);//初始化音频文件
    waveOut.Play();
    
  7. 使用Speech文字转音频播放声音

    需要添加引用System.Speech

    using (SpeechSynthesizer speech = new SpeechSynthesizer())
    {
        speech.Rate = 0;
        speech.Volume = 100;
        speech.Speak("你好啊");
    }
    

 

 

出处:https://www.cnblogs.com/zzr-stdio/p/12758877.html

=======================================================================================

 

 

c#使用SoundPlayer播放wav格式音频

使用

System.Media名称空间下的类SoundPlayer 可以让我们很方便的播放wav波形声音文件。SoundPlayer类其实就是对winmm.dll文件中API函数的封装。

SoundPlayer类的使用很简单。如下:

SoundPlayer player = new SoundPlayer();
player.SoundLocation = "音乐文件名";
player.Load();
player.Play();

其中Play方法是异步方法,会在另一个线程中播放。如果我们有时候需要等声音播放完毕之后再进行下一步操作。即声音播放需要阻塞当前线程。就可以使用PlaySync()

方法

  • SoundPlayer类的缺点:只能播放wav文件;在winxp下播放文件比较大或位率比较高的情况,PlaySync同步播放会有播放不完全的问题。

  • 这个问题的产生是由于winmm.dll的版本问题引起的。在xp下winmm.dll的版本是5。在win7下是6。win7下就没有问题。如果要解决在

  • xp下播放不完全的问题。可以使用xp下的录音机打开声音文件,把声音文件另存为7kbit/s的位率格式,但这样声音效果就很差了。

实现

引用System.Media名称空间下的类SoundPlayer

  SoundPlayer player = new SoundPlayer();

方法调用Play();

public void Play() 
{
	**player.SoundLocation** = @".x0pbk-swz4q.wav";
	//读取音频文件
	**player.Load();
	**//同步模式
	**player.Play();
	**
	 if (MessageBox.Show("播放音樂中,通过旋转耳机上的旋钮测试音量,若聲音播放正常则选是,反之否", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) ==  DialogResult.No) 
	{
		DisplaylistboxMSG("Headset測試結果為異常");
	} else 
	{
		DisplaylistboxMSG("Headset測試結果為正常");
	}
	player.Stop();
	//停止播放
	player.Dispose();
}

 

出处:https://blog.csdn.net/qq_35624605/article/details/120971055

posted on 2022-09-23 10:38  jack_Meng  阅读(956)  评论(0编辑  收藏  举报

导航