服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#使用DirectX.DirectSound播放语音

C#使用DirectX.DirectSound播放语音

2023-02-24 14:58程序猿evint C#

这篇文章主要为大家详细介绍了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

C#使用DirectX.DirectSound播放语音

5、清除播放中音频 ,播放中的音频可以通过Dispose()方法进行释放

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

6、定义

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

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

延伸 · 阅读

精彩推荐
  • C#unity自定义弹出框功能

    unity自定义弹出框功能

    这篇文章主要为大家详细介绍了unity自定义弹出框功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无名之士7902022-08-09
  • C#C#实现NPOI的Excel导出详解

    C#实现NPOI的Excel导出详解

    这篇文章主要介绍了C#实现NPOI的Excel导出的示例代码,文中的实现过程讲解详细,对我们的学习或工作有一定的帮助,感兴趣的可以跟随小编一起学习一下...

    嘿!等你下课5432022-12-21
  • C#Unity UGUI实现滑动翻页效果

    Unity UGUI实现滑动翻页效果

    这篇文章主要为大家详细介绍了Unity UGUI实现滑动翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    同灯花城6852022-09-02
  • C#Unity排行榜优化滚动效果

    Unity排行榜优化滚动效果

    这篇文章主要为大家详细介绍了Unity排行榜优化滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    接啊是哦ida3712022-11-28
  • C#可空类型Nullable<T>用法详解

    可空类型Nullable<T>用法详解

    本文详细讲解了可空类型Nullable<T>的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    Sweet-Tang4682023-02-08
  • C#C# 封装HtmlHelper组件:BootstrapHelper

    C# 封装HtmlHelper组件:BootstrapHelper

    这篇文章主要介绍了C# 封装HtmlHelper组件之BootstrapHelper 的相关资料,需要的朋友可以参考下...

    C#教程网9922021-12-02
  • C#C#基础知识之new关键字介绍

    C#基础知识之new关键字介绍

    在 C# 中,new 关键字可用作运算符、修饰符或约束,本文主要介绍这三种用法。...

    Swich11052021-11-19
  • C#C#获取CPU处理器核心数量的方法

    C#获取CPU处理器核心数量的方法

    本文主要介绍了C#获取CPU处理器核心数量的方法,代码简单易懂,具有很好的参考价值,需要的朋友可以看下...

    弎吩锺熱℃4862021-12-14