NET3.0+中使软件发出声音[整理篇]<转>
.NET3.0+中使软件发出声音[整理篇]
2009-08-10 13:14 by kkun, 13 visits, 网摘, 编辑第一种方法:Speech
Speech控件在.NET中使用非常简单了,都被封装好了
官方连接:system.speech.synthesis.speechsynthesizer.pause.aspx
分三步,第一步添加引用(.NET3.0+ SDK中自带)
using System.Speech.Synthesis
第二步,初始化设置
Talker.Rate = -2; Talker.Volume = 100; Talker.SelectVoiceByHints( VoiceGender.Male, VoiceAge.Child, 2, System.Globalization.CultureInfo.CurrentCulture );
第三步,直接朗读文本
Talker.SpeakAsync( "Hello world!" );
第二种方法:System.Media.SoundPlayer
这个更简单,一步即可
private void playSound(string path) { System.Media.SoundPlayer player = new System.Media.SoundPlayer(); player.SoundLocation = path; player.Load(); player.Play(); }
这个简单是简单了些,功能也简单了,仅支持标准的wav格式
第三种方法:调用平台DLL,winmm.dll
官网连接:http://msdn.microsoft.com/zh-cn/library/ms229685(VS.80).aspx
如何查看系统DLL的方法及如何在C#调用它们点我
这里有一个他人封装好的类,见注释
using System; using System.Runtime.InteropServices; using System.Text; using System.IO ; namespace Tstring.Util { #region /// <SUMMARY> /// clsMci 的摘要说明。 /// </SUMMARY> public class Mp3Player { //http://msdn.microsoft.com/zh-cn/library/ms229685(VS.80).aspx public Mp3Player() { // // TODO: 在此处添加构造函数逻辑 // } //定义API函数使用的字符串变量 [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 )] private string Name = ""; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] private string durLength = ""; [MarshalAs( UnmanagedType.LPTStr, SizeConst = 128 )] private string TemStr = ""; int ilong; //定义播放状态枚举变量 public enum State { mPlaying = 1, mPuase = 2, mStop = 3 }; //结构变量 public struct structMCI { public bool bMut; public int iDur; public int iPos; public int iVol; public int iBal; public string iName; public State state; }; public structMCI mc = new structMCI(); //取得播放文件属性 public string FileName { get { return mc.iName; } set { //ASCIIEncoding asc = new ASCIIEncoding(); try { TemStr = ""; TemStr = TemStr.PadLeft( 127, Convert.ToChar( " " ) ); Name = Name.PadLeft( 260, Convert.ToChar( " " ) ); mc.iName = value; ilong = APIClass.GetShortPathName( mc.iName, Name, Name.Length ); Name = GetCurrPath( Name ); //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media"; Name = "open " + Convert.ToChar( 34 ) + Name + Convert.ToChar( 34 ) + " alias media"; ilong = APIClass.mciSendString( "close all", TemStr, TemStr.Length, 0 ); ilong = APIClass.mciSendString( Name, TemStr, TemStr.Length, 0 ); ilong = APIClass.mciSendString( "set media time format milliseconds", TemStr, TemStr.Length, 0 ); mc.state = State.mStop; } catch( Exception exp ) { Log.Error( exp ); //MessageBox.Show("出错错误!"); } } } //播放 public void play() { TemStr = ""; TemStr = TemStr.PadLeft( 127, Convert.ToChar( " " ) ); APIClass.mciSendString( "play media", TemStr, TemStr.Length, 0 ); mc.state = State.mPlaying; } //停止 public void StopT() { TemStr = ""; TemStr = TemStr.PadLeft( 128, Convert.ToChar( " " ) ); ilong = APIClass.mciSendString( "close media", TemStr, 128, 0 ); ilong = APIClass.mciSendString( "close all", TemStr, 128, 0 ); mc.state = State.mStop; } public void Puase() { TemStr = ""; TemStr = TemStr.PadLeft( 128, Convert.ToChar( " " ) ); ilong = APIClass.mciSendString( "pause media", TemStr, TemStr.Length, 0 ); mc.state = State.mPuase; } private string GetCurrPath( string name ) { if( name.Length < 1 ) return ""; name = name.Trim(); name = name.Substring( 0, name.Length - 1 ); return name; } //总时间 public int Duration { get { durLength = ""; durLength = durLength.PadLeft( 128, Convert.ToChar( " " ) ); APIClass.mciSendString( "status media length", durLength, durLength.Length, 0 ); durLength = durLength.Trim(); if( durLength == "" ) return 0; return (int)( Convert.ToDouble( durLength ) / 1000f ); } } //当前时间 public int CurrentPosition { get { durLength = ""; durLength = durLength.PadLeft( 128, Convert.ToChar( " " ) ); APIClass.mciSendString( "status media position", durLength, durLength.Length, 0 ); mc.iPos = (int)( Convert.ToDouble( durLength ) / 1000f ); return mc.iPos; } } } public class APIClass { [DllImport( "kernel32.dll", CharSet = CharSet.Auto )] public static extern int GetShortPathName( string lpszLongPath, string shortFile, int cchBuffer ); [DllImport( "winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto )] public static extern int mciSendString( string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback ); } #endregion }
第四种:由第三种引申,使主板发出声音
[DllImport( "kernel32.dll" )] private static extern int Beep( int dwFreq, int dwDuration ); void _Beep() { System.Random r = new Random(); for( int i = 0 ; i < 100 ; i++ ) { int c = r.Next( 10000 ); Beep( c, 100 ); } Beep( 2047, 200 ); }
参考资料及常见问题
System.Speech.Synthesis Namespace
语音合成(使用.net3.0中的System.Speech.Synthesis心得)
Speech SDK 5.1 语言包下载- 华军软件园- 系统程序- 系统辅助
Microsoft Speech: Home Page
------------------------------------
记录学习中的点点滴滴,记录这一路走来的风景
原文地址:http://www.cnblogs.com/kkun/archive/2009/08/10/1542797.html