C#使用DirectX.DirectSound播放語(yǔ)音
最近在做項(xiàng)目時(shí),需要進(jìn)行音頻文件的即時(shí)播放,并且要求同時(shí)播放多條語(yǔ)音,之前C#程序中語(yǔ)音播放一直使用System.Media類庫(kù)的SoundPlayer類進(jìn)行播放,但是這個(gè)播放類有個(gè)弊端,就是在播放時(shí)不能搶占式播放語(yǔ)音,經(jīng)過查找資料DirectX.DirectSound可同時(shí)播放多條語(yǔ)音。
DirectX.DirectSound的特點(diǎn)
1、可同時(shí)播放多條語(yǔ)音
2、可分左右聲道進(jìn)行播放
3、可隨時(shí)釋放正在播放的語(yǔ)音
此組件處理流程:
1、創(chuàng)建播放線程
public void StartDirectXSoundThread(Control _con) ?{ ? ? IsStart = true; ? ? if (control == null) control = _con; ? ? Task task = new Task(() => ? ? ? { ? ? ? ? while (true) ? ? ? ? ? ? { ? ? ? ? ? ? ?? try ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (!IsStart) break; ? ? ? ? ? ? ? ? if (!IsPlaying()) ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (soundlist.Count > 0) ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (!IsPlayVoice) ? ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ?IsPlayVoice = true; ? ? ? ? ? ? ? ? ? ? ? ? ? ?control.Invoke((MethodInvoker)delegate ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SoundPlay(soundlist[0]); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? soundlist.RemoveAt(0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }); ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? } ? ? ? ? ? } ? ? ? ?catch (Exception ex) ? ? ? ? { ? ? ? ? ? LogHelper.Debug(ex); ? ? ? ? } ? ? ? ? ? finally ? ? ? ? { ? ? ? ? ? } ? ? ? ? ? Thread.Sleep(100); ? ? ? ? } ? ? }); task.Start(); }
2、釋放播放線程
public void StopDirectXSoundThread() { ? IsStart = false; ?}
3、判斷是否播放中,通過PlayPosition!=0和播放緩沖是否null的條件判斷是否播放
private bool IsPlaying() ? { ? ? bool Ret = false; ? ? ? ?try ? ? ? ? ?{ ? ? ? ? ? if (IsCreate) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (secBuffer != null) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (secBuffer.PlayPosition != 0) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? Ret = true; ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ?catch (Exception ex) ? ? ? { ? ? ? ? ? ? LogHelper.Debug(ex); ? ? ? ? } ? ? ? return Ret; }
4、播放音頻
public void SoundPlay(string _wavpath) ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (_wavpath.IndexOf("\\") < 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? _wavpath = SoundPath + _wavpath; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (_wavpath.IndexOf(".wav") < 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? _wavpath += ".wav"; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (!File.Exists(_wavpath)) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? LogHelper.Info("無(wú)" + _wavpath + "文件!"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? secDev.SetCooperativeLevel(control, CooperativeLevel.Normal); ? ? ? ? ? ? ? ? ? ? BufferDescription buffdes = new BufferDescription() ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? GlobalFocus = true ? ? ? ? ? ? ? ? ? ? }; ? ? ? ? ? ? ? ? ? ? secBuffer = new SecondaryBuffer(_wavpath, buffdes, secDev); ? ? ? ? ? ? ? ? ? ? secBuffer.Play(0, BufferPlayFlags.Default);//設(shè)置緩沖區(qū)為默認(rèn)播放? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? IsCreate = true; ? ? ? ? ? ? ? ? IsPlayVoice = false; ? ? ? ? ? ? } ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? LogHelper.Debug(ex); ? ? } }
左右聲道通過secBuffer.Pan屬性進(jìn)行控制,值含義見下圖:
a、Center中心通道,左右通道同時(shí)播放,默認(rèn)值0
b、Right右通道,值10000
c、Right左通道,值-10000
5、清除播放中音頻 ,播放中的音頻可以通過Dispose()方法進(jìn)行釋放
public void ClearPlay() ? { ? if (secBuffer != null) ? ?{ ? ? soundlist.Clear(); ? ? secBuffer.Dispose(); ? ? IsCreate = false; ? ? ?} }
6、定義
/// <summary> /// 播放設(shè)備 /// </summary> private Device secDev = new Device(); ? /// <summary> /// 播放緩沖區(qū) /// </summary> private SecondaryBuffer secBuffer = null; ? /// <summary> /// 可視化組件 /// </summary> private Control control; ? /// <summary> /// 是否被創(chuàng)建 /// </summary> private bool IsCreate = false;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能
- C#實(shí)現(xiàn)語(yǔ)音播報(bào)功能
- C# windows語(yǔ)音識(shí)別與朗讀實(shí)例
- c# 實(shí)現(xiàn)語(yǔ)音聊天的實(shí)戰(zhàn)示例
- c# 實(shí)現(xiàn)語(yǔ)音合成
- c# 開發(fā)語(yǔ)音識(shí)別程序
- C#基于UDP實(shí)現(xiàn)的P2P語(yǔ)音聊天工具
- C#實(shí)現(xiàn)語(yǔ)音視頻錄制-附demo源碼
- C#中調(diào)用SAPI實(shí)現(xiàn)語(yǔ)音合成的2種方法
- C#實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能
相關(guān)文章
Windows系統(tǒng)中C#調(diào)用WinRAR來(lái)壓縮和解壓縮文件的方法
這篇文章主要介紹了Windows系統(tǒng)中C#調(diào)用WinRAR來(lái)壓縮和解壓縮文件的方法,個(gè)人感覺在Windows中WinRAR相對(duì)7-zip更加穩(wěn)定一些,需要的朋友可以參考下2016-04-04C#中使用Spire.XLS來(lái)操作Excel數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了C#中使用Spire.XLS來(lái)操作Excel數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11