C#使用DirectX.DirectSound播放語音
最近在做項目時,需要進行音頻文件的即時播放,并且要求同時播放多條語音,之前C#程序中語音播放一直使用System.Media類庫的SoundPlayer類進行播放,但是這個播放類有個弊端,就是在播放時不能搶占式播放語音,經過查找資料DirectX.DirectSound可同時播放多條語音。
DirectX.DirectSound的特點
1、可同時播放多條語音
2、可分左右聲道進行播放
3、可隨時釋放正在播放的語音
此組件處理流程:
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("無" + _wavpath + "文件!");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? secDev.SetCooperativeLevel(control, CooperativeLevel.Normal);
? ? ? ? ? ? ? ? ? ? BufferDescription buffdes = new BufferDescription()
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? GlobalFocus = true
? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ? secBuffer = new SecondaryBuffer(_wavpath, buffdes, secDev);
? ? ? ? ? ? ? ? ? ? secBuffer.Play(0, BufferPlayFlags.Default);//設置緩沖區(qū)為默認播放?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? IsCreate = true;
? ? ? ? ? ? ? ? IsPlayVoice = false;
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? LogHelper.Debug(ex);
? ? }
}左右聲道通過secBuffer.Pan屬性進行控制,值含義見下圖:
a、Center中心通道,左右通道同時播放,默認值0
b、Right右通道,值10000
c、Right左通道,值-10000

5、清除播放中音頻 ,播放中的音頻可以通過Dispose()方法進行釋放
public void ClearPlay()
? {
? if (secBuffer != null)
? ?{
? ? soundlist.Clear();
? ? secBuffer.Dispose();
? ? IsCreate = false;
? ? ?}
}6、定義
/// <summary> /// 播放設備 /// </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;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Windows系統(tǒng)中C#調用WinRAR來壓縮和解壓縮文件的方法
這篇文章主要介紹了Windows系統(tǒng)中C#調用WinRAR來壓縮和解壓縮文件的方法,個人感覺在Windows中WinRAR相對7-zip更加穩(wěn)定一些,需要的朋友可以參考下2016-04-04
C#中使用Spire.XLS來操作Excel數(shù)據(jù)的實現(xiàn)
本文主要介紹了C#中使用Spire.XLS來操作Excel數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04
Silverlight文件上傳下載實現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11

