speech
是一个朗读器,我们写一个文本text
或者string
,speech
可以朗读发音,支持异步操作使用方便,推荐使用。
Speech两种使用方法
using System.Speech.Synthesis;
SpeechSynthesizer synth = new SpeechSynthesizer();
synth.SpeakAsync(msg);
要加载COM组件:Microsoft speech object Library
using SpeechLib;
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 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);
windows
操作系统中的winmm.dll
文件中封装了声音处理的函数。在C#
中我们可以通过平台调用的方式使用这里边的API函数来播放声音。
下边的类中使用了PlaySound
、sndPlaySound
、mciSendString
3个API函数来播放声音。
其中mciSendString还可以播放mp3格式的声音。
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.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);
}
}
}
新建一个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#播放背景音乐的方法小结