C#播放声音的四种方法755.pdf

上传人:深夜****等你... 文档编号:75098566 上传时间:2023-03-01 格式:PDF 页数:48 大小:2.04MB
返回 下载 相关 举报
C#播放声音的四种方法755.pdf_第1页
第1页 / 共48页
C#播放声音的四种方法755.pdf_第2页
第2页 / 共48页
点击查看更多>>
资源描述

《C#播放声音的四种方法755.pdf》由会员分享,可在线阅读,更多相关《C#播放声音的四种方法755.pdf(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 C#播放声音的四种方法 C#播放声音的四种方法 C#播放声音的四种方法 介绍之前首先推荐一个程序员专用搜索引擎-http:/ 第一种是利用 DirectX 1.安装了 DirectX SDK(有 9 个 DLL 文件)。这里 我 们 只 用 到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSound.dll 2.引入 DirectX 的 DLL 文件的名字空间:using Microsoft.DirectX;using Microsoft.DirectX.DirectSound;3.建立设备 Device dv=new Device();4.

2、设置 CooperativeLevel。因为 windows 是多任务的系统,设备不是独占的 SecondaryBuffer buf=new SecondaryBuffer(snd.wav,dv);5.开 辟 缓 冲 区SecondaryBuffer buf=new SecondaryBuffer(snd.wav,dv);6.接下来就可以播放啦。第一个参数表示优先级别,0 是最低的。第 2 个参数是播放方式,这里是循环播放。buf.Play(0,BufferPlayFlags.Looping);第 二 种 是 利 用Microsoft speech object Library /summar

3、y /播放声音文件 /文件全名 public void PlaySound(string FileName)/要加载COM 组件:Microsoft speech object Library if(!System.IO.File.Exists(FileName)return;SpeechLib.SpVoiceClass pp=new SpeechLib.SpVoiceClass();SpeechLib.SpFileStreamClass spFs=new SpeechLib.SpFileStreamClass();spFs.Open(FileName,SpeechLib.SpeechStre

4、amFileMode.SSFMOpenFo rRead,true);SpeechLib.ISpeechBaseStream Istream=spFs as SpeechLib.ISpeechBaseStream;pp.SpeakStream(Istream,SpeechLib.SpeechVoiceSpeakFlags.SVSFIsFilename);spFs.Close();第三种:引用 SoundPlayer System.Media.SoundPlayer sndPlayer=new System.Media.SoundPlayer(Application.StartupPath+/pm

5、3.wav);sndPlayer.PlayLooping();第 4 种:利用 Windows Media Player 新建一个 C#的 Windows Form 工程(Windows 应用程 序),并 且 定 义 两 个 菜 单 按 钮(menuItem1,menuItem2)。选择菜单中的“工具”中的“自定义工具箱(添加/移除工具箱项)”,在自定义工具箱的窗口中,点击展开“COM 组件”项,选中“Window Media Player”选项。确定后在“工具箱”中便会出现“Windows Media Player”这一项,然后再将其拖至 Form 上,调整大小,系统在“引用”中自动加入了对

6、此 dll 的引用,AxMediaPlayer 就是我们使用的 Namespace 与 class。在属性栏中设置好此控件的一些属性,为了方便,这里我把 AutoStart 设置成为 true(其实默认是 true),只要 FileName 被设置(打开了文件),则文件将会自动播放。完整代码如下:private void menuItem1_Click(object sender,System.EventArgs e)OpenFileDialog ofDialog=new OpenFileDialog();ofDialog.AddExtension=true;ofDialog.CheckFil

7、eExists=true;ofDialog.CheckPathExists=true;/the next sentence 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.FileNa

8、me=ofDialog.FileName;this.axMediaPlayer1.URL=ofDialog.FileName;/2005 用法 这里使用的是微软的播放器,大家也可以试试Winamp 的控件,如果你只需要播放声音而不需要显示,你只要把 AxMediaPlayer 的 Visible 属性设置为 false 就可以了。/Sound.cs /(c)Copyright Jason Clark 2003 /Shows a variety of basic marshalling concepts by making sounds using System;using Wintellect

9、.Interop.Sound;class App public static void Main()/Produce an OK beep Sound.MessageBeep(BeepTypes.Ok);System.Threading.Thread.Sleep(1000);/Ok,now for some circa-1977 si-fi Random rand =new Random();for(Int32 index =0;index 7 ;index+)Sound.Beep(rand.Next(500)+1000,TimeSpan.FromSeconds(.10);/Pick a wa

10、ve,any wave Sound.PlayWave(C:WINDOWSMediaBATTLOW.WAV,true );System.Threading.Thread.Sleep(2000 );Sound.StopWave();namespace Wintellect.Interop.Sound using System.Runtime.InteropServices;using System.ComponentModel;sealed class Sound /Friendly MessageBeep()wrapper public static void MessageBeep(BeepT

11、ypes type)if(!MessageBeep(UInt32)type )Int32 err =Marshal.GetLastWin32Error();throw new Win32Exception(err );/Friendly low-level beep wrapper public static void Beep(Int32 frequency,Int32 milliseconds)if(!UnmanagedBeep(UInt32)frequency,(UInt32)milliseconds )Int32 err =Marshal.GetLastWin32Error();thr

12、ow new Win32Exception(err );/Friendly low-level beep wrapper with TimeSpan public static void Beep(Int32 frequency,TimeSpan duration)Beep(frequency,(Int32)duration.TotalMilliseconds );/Friendly PlaySound()wrapper for playing wave files public static void PlayWave(String filename,Boolean looped)UInt3

13、2 flags =sndAsyncFlag|sndFilenameFlag;if(looped )flags|=sndLoopFlag;if(!PlaySound(filename,IntPtr.Zero,flags )Int32 err =Marshal.GetLastWin32Error();throw new Win32Exception(err );/Friendly PlaySound()wrapper for playing wave files public static void PlayWave(String filename)PlayWave(filename,false

14、);/Friendly PlaySound()wrapper for stopping wave files public static void StopWave()PlayWave(null );/static extern methods for making sound through interop DllImport(User32.dll,SetLastError =true )static extern Boolean MessageBeep(UInt32 beepType);DllImport(Kernel32.dll,EntryPoint =Beep,SetLastError

15、 =true)static extern Boolean UnmanagedBeep(UInt32 frequency,UInt32 duration);DllImport(Winmm.dll,CharSet =CharSet.Auto,SetLastError =true)static extern Boolean PlaySound(String filename,IntPtr module,UInt32 flags);/Some private helper values for calling PlaySound const UInt32 sndAsyncFlag =0 x0001;c

16、onst UInt32 sndLoopFlag =0 x0008;const UInt32 sndFilenameFlag =0 x00020000;private Sound()/Enum for message beep types enum BeepTypes Simple =-1,Ok =0 x00000000,IconHand =0 x00000010,IconQuestion =0 x00000020,IconExclamation =0 x00000030,IconAsterisk =0 x00000040 DllImport(Winmm.dll)public static ex

17、tern long PlaySound(string name,long module,long flag);DllImport(winmm.dll)private static extern long mciSendString(string lpstrCommand,string lpstrReturnString,long length,long hwndcallback);private string m_MusicName=;private void PlayMusic()m_MusicName=+Tool.ReadInfo(promptmusicfile)+;if(m_MusicN

18、ame.Length=0)return;try mciSendString(close +m_MusicName,0,0);mciSendString(open +m_MusicName,0,0);mciSendString(play +m_MusicName ,0,0);catch private void StopMusic()try mciSendString(close +m_MusicName,0,0);catch 播放内存中的 WAV 文件可以这样:/API 定义 private const int SND_ASYNC =0 x1;private const int SND_MEM

19、ORY =0 x4;DllImport(winmm.dll)private static extern int sndPlaySoundA(byte lpszSoundName,int uFlags);/将 blip1.wav 添加入工程并设置为嵌入的资源 /现在是将它读入内存备用 Type t=this.GetType();System.Reflection.Assembly a=t.Assembly;System.IO.Stream stream=a.GetManifestResourceStream(t.Namespace+.blip1.wav);byte ba=new bytestre

20、am.Length;stream.Read(ba,0,ba.Length);stream.Close();/播放缓存 sndPlaySoundA(ba,SND_MEMORY);用 API 函数 winmm 下的 PlaySound 播放声音:(一).说明 一个播放音乐的类,要准备好自己的音乐文件,比如:*.mid/*.wav 等 (二).步骤 using System;using System.Collections;using System.ComponentModel;using System.Runtime.InteropServices;namespace 象棋游戏音效支持类 /用于播

21、放音乐 /internal class Helpers Flags public enum PlaySoundFlags:int SND_SYNC=0 x0000,/*play synchronously(default)*/同步 SND_ASYNC=0 x0001,/*play asynchronously*/异步 SND_NODEFAULT=0 x0002,/*silence(!default)if sound not found*/SND_MEMORY=0 x0004,/*pszSound points to a memory file*/SND_LOOP=0 x0008,/*loop

22、the sound until next sndPlaySound*/SND_NOSTOP=0 x0010,/*dont stop any currently playing sound*/SND_NOWAIT=0 x00002000,/*dont wait if the driver is busy*/SND_ALIAS=0 x00010000,/*name is a registry alias*/SND_ALIAS_ID=0 x00110000,/*alias is a predefined ID*/SND_FILENAME=0 x00020000,/*name is file name

23、*/SND_RESOURCE=0 x00040004 /*name is resource name or atom*/DllImport(winmm)public static extern bool PlaySound(string szSound,IntPtr hMod,PlaySoundFlags flags);public class Sound public static void Play(string strFileName)switch(strFileName)case start:strFileName=.soundstart.WAV;break;case back:str

24、FileName=.soundback.WAV;break;case fall:strFileName=.soundfall.WAV;break;case huiqi:strFileName=.soundhuiqi.WAV;break;case huiqiend:strFileName=.soundhuiqiend.WAV;break;case jiangjun:strFileName=.soundjiangjun.WAV;break;case kill:strFileName=.soundkill.WAV;break;case win:strFileName=.soundwin.WAV;br

25、eak;case move:strFileName=.soundmove.WAV;break;case hold:strFileName=.soundhold.WAV;break;case no:strFileName=.soundno.WAV;break;case popup:strFileName=.soundpopup.WAV;break;case mayfall:strFileName=.soundmayfall.WAV;break;/调用 PlaySound 方法,播放音乐 Helpers.PlaySound(strFileName,IntPtr.Zero,Helpers.PlayS

26、oundFlags.SND_FILENAME|Helpers.PlaySoundFlags.SND_ASYNC);(三).使用 1.添加组件(Interop.WMPLib).这个类库 VS.Net 自带的,默认没有添加进来.方法:展开项目文件夹,右击引用,添加引用,到 Com 组件栏,找到添加到项目中.2.新建一个*.cs 文件,把这些代码拷贝进去,全部覆盖即可,并修改上例子中的播放文件名.就是这样的语句:strFileName=.soundmayfall.WAV;/一定要存在这个音乐文件,否则不能播放 3.如果调用这个方法的地方与此类不在同一个命名空间.要在用的地方打开类的命名空间.方法:如

27、这个示例类的命名空间应该这样写:using PlaySound;最后就可以用了,用法极简单,直接调用此类的方法:Sound.Play(move);/其中参数为音乐文件名(自定义)相应 Blog 链接:http:/ using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace MovSysSht internal class CSoundPlay public CSoundPlay()/TODO:在此处

28、添加构造函数逻辑 /Flags public enum PlaySoundFlags:int SND_SYNC=0 x0000,/*play synchronously(default)*/SND_ASYNC=0 x0001,/*play asynchronously*/SND_NODEFAULT=0 x0002,/*silence(!default)if sound not found*/SND_MEMORY=0 x0004,/*pszSound points to a memory file*/SND_LOOP=0 x0008,/*loop the sound until next snd

29、PlaySound*/SND_NOSTOP=0 x0010,/*dont stop any currently playing sound*/SND_NOWAIT=0 x00002000,/*dont wait if the driver is busy*/SND_ALIAS=0 x00010000,/*name is a registry alias*/SND_ALIAS_ID=0 x00110000,/*alias is a predefined ID*/SND_FILENAME=0 x00020000,/*name is file name*/SND_RESOURCE=0 x000400

30、04/*name is resource name or atom*/DllImport(winmm.dll)public static extern bool PlaySound(string szSound,IntPtr hMod,PlaySoundFlags flags);public class Sound public static void Play(string strFileName)CSoundPlay.PlaySound(strFileName,IntPtr.Zero,CSoundPlay.PlaySoundFlags.SND_FILENAME|CSoundPlay.Pla

31、ySoundFlags.SND_ASYNC);c#播放 mp3 控件 C#播放器空件 的常用方法 /*/MediaPlay 9 右击工具箱-选择项(I).-显示选择工具箱项-COM 组件-Windows Media Player wmp.dll 添加 axWindowsMediaPlayer1.windowlessVideo=false;/设为 false 后双击屏幕可以全屏 axWindowsMediaPlayer1.fullScreen=true;/设播放器全屏播放 axWindowsMediaPlayer1.URL=mms:/192.168.0.102/vod/jingwei.wma;a

32、xWindowsMediaPlayer1.Ctlcontrols.play();/播放 axWindowsMediaPlayer1.Ctlcontrols.stop();/停止 axWindowsMediaPlayer1.Ctlcontrols.pause();/暂停 axWindowsMediaPlayer1.settings.autoStart=true;/自动播放 axWindowsMediaPlayer1.settings.mute=false;/静音 axWindowsMediaPlayer1.settings.volume=100;/音量 int 0 100 100 是最大音量 a

33、xWindowsMediaPlayer1.currentMedia.duration.ToString();/影片长度 axWindowsMediaPlayer1.Ctlcontrols.currentPosition=30;/当前的播放位置 double axWindowsMediaPlayer1.currentMedia.getItemInfo(Title);/标题 axWindowsMediaPlayer1.currentMedia.getItemInfo(Author);/作者 /*/*/MediaPlay 以前版本 右击工具箱-选择项(I).-显示选择工具箱项-COM 组件-浏览(B

34、).-C:WINDOWSsystem32msdxm.ocx-打开 Windows Media Player msdxm.dll 添加 label4.Text=axMediaPlayer1.Volume.ToString();/音量 axMediaPlayer1.FileName=mms:/218.98.101.164/vod/jingwei.wma;/文件路径 axMediaPlayer1.Play();/开始播放 /*/*/右击工具箱-选择项(I).-显示选择工具箱项-COM 组件-RealPlayer G2 Control rmoc3260.dll 添加 axRealAudio1.Sour

35、ce=F:mp3hh.mp3;/播放路径 axRealAudio1.CanPlayPause();/Bool 型是否能暂停 axRealAudio1.CanPause();/暂停 axRealAudio1.DoPlayPause();/正在播放的影片暂停播放 axRealAudio1.CanPlay();/Bool 是否能播放 axRealAudio1.DoPlay();/播放 axRealAudio1.CanStop()/播放是否可以停止 axRealAudio1.DoStop();/播放停止 axRealAudio1.SetCenter(true);/按影片原大小播放 axRealAudi

36、o1.SetFullScreen();/播放器全屏播放影片 int place=axRealAudioP.GetPosition();axRealAudio1.DoStop();axRealAudio1.SetCente*(*lse);/拉伸播放 axRealAudio1.SetCenter(true);按影片原始大小播放 axRealAudio1.DoPlay();axRealAudio1.SetPosition(place);nResL=axRealAudio1.GetPosition();/获得当前影片 的播放进度 label1.Text=axRealAudio1.GetTitle();

37、/获得影片的标题 label2.Text=当前的带宽:+axRealAudio1.GetBandwidthCurrent()/1024+KB;/当前影片的当前的带宽 label3.Text=连接的带宽:+axRealAudio1.GetConnectionBandwidth()/1024+KB;/当前的连接的带宽 怎么获取 mp3 的头文件信息 比如歌曲名,歌手等 呵呵,我以前回答过这个问题,可以看看以前我的得分贴:!http:/ static void Main(string args)byte b =new byte128;string sTitle;string sSinger;stri

38、ng sAlbum;string sYear;string sComm;FileStream fs =new FileStream(d:mp3.mp3,FileMode.Open);fs.Seek(-128,SeekOrigin.End);fs.Read(b,0,128);bool isSet=false;String sFlag =System.Text.Encoding.Default.GetString(b,0,3);if (sFlag.CompareTo(TAG)=0)System.Console.WriteLine (Tag is setted!);isSet=true;if (is

39、Set)/get title of song;sTitle =System.Text.Encoding.Default.GetString (b,3,30);System.Console.WriteLine (Title:+sTitle);/get singer;sSinger =System.Text.Encoding.Default.GetString (b,33,30);System.Console.WriteLine (Singer:+sSinger);/get album;sAlbum =System.Text.Encoding.Default.GetString (b,63,30)

40、;System.Console.WriteLine (Album:+sAlbum);/get Year of publish;sYear=System.Text.Encoding.Default.GetString (b,93,4);System.Console.WriteLine (Year:+sYear);/get Comment;sComm=System.Text.Encoding.Default.GetString (b,97,30);System.Console.WriteLine (Comment:+sComm);System.Console.WriteLine(Any key t

41、o exit!);System.Console.Read();上面是取得 v1 的方法 C#中用 API 实现 MP3 等音频文件的播放类 C#没有提供播放 MP3 等音频文件的类,要编写播放 MP3 等音频文件程序,必须使用第三方控件或类。本文使用 API 函数 mciSendString,编写一个播放 MP3 等音频文件的类。具体源码如下:一、使用 API 函数 mciSendString 构成的媒体播放类。using System;using System.Runtime.InteropServices;using System.Text;using System.IO;namespac

42、e clsMCIPlay /clsMci 的摘要说明。/public class clsMCI public clsMCI()/TODO:在此处添加构造函数逻辑 /定义 API 函数使用的字符串变量 MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)private string Name=;MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)private string durLength=;MarshalAs(UnmanagedType.LPTStr,SizeConst=128)private stri

43、ng 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 g

44、et 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.ToC

45、har(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.st

46、ate=State.mStop;catch 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.mciSendStri

47、ng(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)i

48、f(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

49、;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 API

50、Class 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 u

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁