C#使用DirectX.DirectSound播放语音
最近在做项目时,需要进行音频文件的即时播放,并且要求同时播放多条语音,之前C#程序中语音播放一直使用System.Media类库的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(() =>
{
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);//设置缓冲区为默认播放
}
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、定义
////// 播放设备 /// private Device secDev = new Device(); ////// 播放缓冲区 /// private SecondaryBuffer secBuffer = null; ////// 可视化组件 /// private Control control; ////// 是否被创建 /// private bool IsCreate = false;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
上一篇:C#调用USB摄像头的方法
下一篇:C#实现文本转语音功能
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?

