日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C#使用DirectX.DirectSound播放語(yǔ)音_C#教程

作者:程序猿evint ? 更新時(shí)間: 2022-05-29 編程語(yǔ)言

最近在做項(xiàng)目時(shí),需要進(jìn)行音頻文件的即時(shí)播放,并且要求同時(shí)播放多條語(yǔ)音,之前C#程序中語(yǔ)音播放一直使用System.Media類(lèi)庫(kù)的SoundPlayer類(lèi)進(jìn)行播放,但是這個(gè)播放類(lèi)有個(gè)弊端,就是在播放時(shí)不能搶占式播放語(yǔ)音,經(jīng)過(guò)查找資料DirectX.DirectSound可同時(shí)播放多條語(yǔ)音。

DirectX.DirectSound的特點(diǎn)

1、可同時(shí)播放多條語(yǔ)音

2、可分左右聲道進(jìn)行播放

3、可隨時(shí)釋放正在播放的語(yǔ)音

此組件處理流程:

1、創(chuàng)建播放線(xiàn)程

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、釋放播放線(xiàn)程

public void StopDirectXSoundThread()
{
? IsStart = false;
?}

3、判斷是否播放中,通過(guò)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);
? ?  }
}

左右聲道通過(guò)secBuffer.Pan屬性進(jìn)行控制,值含義見(jiàn)下圖:

a、Center中心通道,左右通道同時(shí)播放,默認(rèn)值0

b、Right右通道,值10000

c、Right左通道,值-10000

5、清除播放中音頻 ,播放中的音頻可以通過(guò)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;

原文鏈接:https://blog.csdn.net/evint888/article/details/122387024

欄目分類(lèi)
最近更新