运维开发网

使用DirectX,DirectSound播放语音

运维开发网 https://www.qedev.com 2022-04-30 16:01 出处:网络
这篇文章主要为大家详细介绍了C#使用DirectX.DirectSound播放语音,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


这篇文章主要为大家详细介绍了C#使用DirectX.DirectSound播放语音,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近做项目,需要即时播放音频文件,要求同时播放多个声音。之前,C#程序中播放的语音一直是由系统的SoundPlayer类来播放的。媒体类库,但是这个播放类有个缺点,就是播放的时候不能抢先播放语音,通过搜索数据DirectX.DirectSound可以同时播放多个语音。

DirectX.DirectSound的特点

1.可以同时播放多个声部。

2.可以左右声道播放。

3.您可以随时释放播放语音。

该组件的处理流程:

1.创建一个回放线程。

public void StartDirectXSoundThread(Control _con)?{? ? IsStart = true;? ? if (control == null) control = _con;? ? Task task = new Task(() =gt;? ? ? {? ? ? ? while (true)? ? ? ? ? ? {? ? ? ? ? ? ?? try? ? ? ? ? ? ? {? ? ? ? ? ? ? ? if (!IsStart) break;? ? ? ? ? ? ? ? if (!IsPlaying())? ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? if (soundlist.Count gt; 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以及回放缓冲区是否为空。

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("\\") lt; 0)? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? _wavpath = SoundPath + _wavpath;? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? if (_wavpath.IndexOf(".wav") lt; 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);//设置缓冲区为默认播放?? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? IsCreate = true;? ? ? ? ? ? ? ? IsPlayVoice = false;? ? ? ? ? ? }? ? ? ? ? ? catch (Exception ex)? ? ? ? ? ? {? ? ? ? ? ? ? ? LogHelper.Debug(ex);? ? }}

左右声道由secBuffer控制。Pan属性,其取值含义如下图所示:

a、中央声道、左右声道同时播放,默认值为0

右声道,值10000

c,右左声道,值-10000


5.清除正在播放的音频,可以通过Dispose()方法释放。

public void ClearPlay()? {? if (secBuffer != null)? ?{? ? soundlist.Clear();? ? secBuffer.Dispose();? ? IsCreate = false;? ? ?}}

6.定义

/// lt;summarygt;/// 播放设备/// lt;/summarygt;private Device secDev = new Device();?/// lt;summarygt;/// 播放缓冲区/// lt;/summarygt;private SecondaryBuffer secBuffer = null;?/// lt;summarygt;/// 可视化组件/// lt;/summarygt;private Control control;?/// lt;summarygt;/// 是否被创建/// lt;/summarygt;private bool IsCreate = false;

这就是本文的全部内容。希望对大家的学习有帮助,也希望大家能支持一下搜源网。


0

精彩评论

暂无评论...
验证码 换一张
取 消