C#播放背景音乐的五种方法

Speech


speech是一个朗读器,我们写一个文本text或者stringspeech可以朗读发音,支持异步操作使用方便,推荐使用。

Speech两种使用方法

使用.NET类库和系统API:


using System.Speech.Synthesis;

SpeechSynthesizer synth = new SpeechSynthesizer();
synth.SpeakAsync(msg);

C#播放背景音乐的五种方法_第1张图片

com组件speech-Microsoft speech object Library


要加载COM组件:Microsoft speech object Library

using SpeechLib;

C#播放背景音乐的五种方法_第2张图片

SpeechSynthesizer synth = new SpeechSynthesizer();
synth.SpeakAsync(msg);

如下代码参见SpeechSynthesizer 异步播放多组声音同时响

使用委托代理:
delegate void MyDelegate(string content);
string content="";
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
//点击开始按钮
private void btnRead_Click(object sender, RoutedEventArgs e)
         {
             content = textBoxContent.Text;
             MyDelegate myDelegate = new MyDelegate(speakParagh);
             //异步调用委托
             myDelegate.BeginInvoke(content,new AsyncCallback(Completed), null);
             //在启动异步线程后,主线程可以继续工作而不需要等待
          }
 private void speakParagh(string text)
         {
             synthesizer.Speak(text);
         }

//朗读结束后释放资源
 private void Completed(IAsyncResult result)
        {
            synthesizer.SpeakAsyncCancelAll();
        }

利用DirectX


首先要安装DirectX SDK。安装好之后,在C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0目录下有在.net下可以使用的dll文件。

引用添加引用Microsoft.DirectX.AudioVideoPlayback

using Microsoft.DirectX.AudioVideoPlayback; 

然后实例化Audo类的对象,就可以播放包括mp3格式的音乐文件了。

Audio audio = new Audio("hello.mp3");
audio.play();

我们安装了DirectX SDK(有9个DLL文件)

这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx.DirectSound.dll

引入DirectX 的DLL文件的名字空间:
 

using Microsoft.DirectX;
usingMicrosoft.DirectX.DirectSound;

建立设备

Device dv=newDevice();

设置CooperativeLevel。因为windows是多任务的系统,设备不是独占的

SecondaryBufferbuf=new SecondaryBuffer(@"snd.wav",dv);

开辟缓冲区SecondaryBufferbuf=new SecondaryBuffer(@”snd.wav”,dv);

接下来就可以播放啦。第一个参数表示优先级别,0是最低的。第2个参数是播放方式,这里是循环播放。

 buf.Play(0,BufferPlayFlags.Looping);

使用API函数进行播放SoundPlayer


windows操作系统中的winmm.dll文件中封装了声音处理的函数。在C#中我们可以通过平台调用的方式使用这里边的API函数来播放声音。

下边的类中使用了PlaySoundsndPlaySoundmciSendString 3个API函数来播放声音。

其中mciSendString还可以播放mp3格式的声音。
SoundPlayer类的使用很简单

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

其中Play方法是异步方法,会在另一个线程中播放。如果我们有时候需要等声音播放完毕之后再进行下一步操作。

即声音播放需要阻塞当前线程。就可以使用PlaySync()方法。

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

这个问题的产生是由于winmm.dll的版本问题引起的。在xpwinmm.dll的版本是5。在win7下是6。win7下就没有问题。如果要解决在xp下播放不完全的问题。可以使用xp下的录音机打开声音文件,把声音文件另存为7kbit/s的位率格式,但这样声音效果就很差了。

System.Media.SoundPlayersndPlayer = newSystem.Media.SoundPlayer(Application.StartupPath+@"/pm3.wav");
sndPlayer.PlayLooping();

其他使用方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using System.Runtime.InteropServices;
namespace HuaXu
{
public static class WavPlayer
{
    [DllImport("winmm.dll", SetLastError = true)]
    static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
    [DllImport("winmm.dll", SetLastError = true)]
    static extern long mciSendString(string strCommand, 
        StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback);
    [DllImport("winmm.dll")]
    private static extern long sndPlaySound(string lpszSoundName, long uFlags);

    [Flags]
    public enum SoundFlags
    {
        /// play synchronously (default)
        SND_SYNC = 0x0000,
        /// play asynchronously
        SND_ASYNC = 0x0001,
        /// silence (!default) if sound not found
        SND_NODEFAULT = 0x0002,
        /// pszSound points to a memory file
        SND_MEMORY = 0x0004,
        /// loop the sound until next sndPlaySound
        SND_LOOP = 0x0008,
        /// don’t stop any currently playing sound
        SND_NOSTOP = 0x0010,
        /// Stop Playing Wave
        SND_PURGE = 0x40,
        /// don’t wait if the driver is busy
        SND_NOWAIT = 0x00002000,
        /// name is a registry alias
        SND_ALIAS = 0x00010000,
        /// alias is a predefined id
        SND_ALIAS_ID = 0x00110000,
        /// name is file name
        SND_FILENAME = 0x00020000,
        /// name is resource name or atom
        SND_RESOURCE = 0x00040004
    }

    public static void Play(string strFileName)
    {
        PlaySound(strFileName, UIntPtr.Zero, 
           (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_SYNC | SoundFlags.SND_NOSTOP));
    }
    public static void mciPlay(string strFileName)
    {
        string playCommand = "open " + strFileName + " type WAVEAudio alias MyWav";
        mciSendString(playCommand, null, 0, IntPtr.Zero);
        mciSendString("play MyWav", null, 0, IntPtr.Zero);

    }
    public static void sndPlay(string strFileName)
    {
        sndPlaySound(strFileName, (long)SoundFlags.SND_SYNC);
    }
}
}

利用Windows Media Player


新建一个C#Windows Form工程(Windows应用程序),并且定义两个菜单按钮(menuItem1,menuItem2)。
选择菜单中的“工具”中的“自定义工具箱(添加/移除工具箱项)”,在自定义工具箱的窗口中,点击展开“COM 组件”项,选中“WindowMedia Player”选项。确定后在“工具箱”中便会出现“Windows Media Player”这一项,然后再将其拖至Form上,调整大小,系统在“引用”中自动加入了对此dll的引用,AxMediaPlayer就是我们使用的 Namespace与class。

在属性栏中设置好此控件的一些属性,为了方便,这里我把AutoStart设置成为true(其实默认是true),只要FileName被设置(打开了文件),则文件将会自动播放。完整代码如下:

private voidmenuItem1_Click(object sender, System.EventArgs e)
{
OpenFileDialogofDialog = new OpenFileDialog();
ofDialog.AddExtension= true;
ofDialog.CheckFileExists= true;
ofDialog.CheckPathExists= true;
//the nextsentence must be in single line
ofDialog.Filter= "VCD文件(*.dat)|*.dat|Audio文件(*.avi)|*.avi
  |WAV文件(*.wav)|*.wav|MP3文件(*.mp3)|*.mp3|所有文件 (*.*)|*.*";
ofDialog.DefaultExt= "*.mp3";
if(ofDialog.ShowDialog()== DialogResult.OK)
{
// 2003一下版本 方法this.axMediaPlayer1.FileName = ofDialog.FileName;
this.axMediaPlayer1.URL=ofDialog.FileName;//2005用法
}
}

这里使用的是微软的播放器,大家也可以试试Winamp的控件,如果你只需要播放声音而不需要显示,你只要把AxMediaPlayer的Visible属性设置为false就可以了。

参考 C#播放背景音乐的方法小结

你可能感兴趣的:(♥语言拾遗♥,┈┈【C#那些事】)