一、语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点:
(1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会好很多,延迟低,并且能够第·一时间与听众互动,时效性强。

(2)隐私性:这一点体现在何处,如主播不想暴露自己的长相,或者进行问题回答是,没有视频的话会让主播感到更安心,所以语音直播隐私性更强。

(3)内容质量高:因为语音直播不靠“颜值”只有好的内容才能够吸引用户,所以语音直播相对来说内容质量更高。

(4)成本降低:语音直播相对视频直播来说,带宽流量等都会便宜许多,成本降低不少,更加实惠。

二、语音聊天主要步骤:音频采集、压缩编码、网络传输、解码还原、播放音频,如下图所示

下面就从代码的角度来详说一下这几个步骤。

(1)音频采集,读取麦克风设备数据

private readonly WaveIn _waveIn;
_waveIn = new WaveIn();
_waveIn.BufferMilliseconds = 50;
_waveIn.DeviceNumber = 0;
_waveIn.DataAvailable += OnAudioCaptured;
_waveIn.StartRecording();
(2)音频数据压缩编码,常见压缩格式比较多,例如mp3、acc、speex等,这里以speex为例

private readonly WideBandSpeexCodec _speexCodec;
_speexCodec = new WideBandSpeexCodec();
_waveIn.WaveFormat = _speexCodec.RecordFormat;void OnAudioCaptured(object sender, WaveInEventArgs e)
{byte[] encoded = _speexCodec.Encode(e.Buffer, 0, e.BytesRecorded);_audioClient.Send(encoded);
}

(3)网络传输,为了保证即时传输udp协议有着天然的优点

using SAEA.Sockets;
using SAEA.Sockets.Base;
using SAEA.Sockets.Model;
using System;
using System.Net;namespace GFF.Component.GAudio.Net
{public class AudioClient{IClientSocket _udpClient;BaseUnpacker _baseUnpacker;public event Action<Byte[]> OnReceive;public AudioClient(IPEndPoint endPoint){var bContext = new BaseContext();_udpClient = SocketFactory.CreateClientSocket(SocketOptionBuilder.Instance.SetSocket(SAEASocketType.Udp).SetIPEndPoint(endPoint).UseIocp(bContext).SetReadBufferSize(SocketOption.UDPMaxLength).SetWriteBufferSize(SocketOption.UDPMaxLength).Build());_baseUnpacker = (BaseUnpacker)bContext.Unpacker;_udpClient.OnReceive += _udpClient_OnReceive;}private void _udpClient_OnReceive(byte[] data){OnReceive?.Invoke(data);}public void Connect(){_udpClient.Connect();}public void Send(byte[] data){_udpClient.SendAsync(data);}public void Disconnect(){_udpClient.Disconnect();}}
}

(4)服务器转发,客户端使用udp,服务器这里同样也使用udp来转发

using SAEA.Sockets;
using SAEA.Sockets.Base;
using SAEA.Sockets.Interface;
using SAEA.Sockets.Model;
using System;
using System.Collections.Concurrent;
using System.Net;
using System.Threading.Tasks;namespace GFF.Component.GAudio.Net
{public class AudioServer{IServerSocket _udpServer;ConcurrentDictionary<string, IUserToken> _cache;public AudioServer(IPEndPoint endPoint){_cache = new ConcurrentDictionary<string, IUserToken>();_udpServer = SocketFactory.CreateServerSocket(SocketOptionBuilder.Instance.SetSocket(SAEASocketType.Udp).SetIPEndPoint(endPoint).UseIocp<BaseContext>().SetReadBufferSize(SocketOption.UDPMaxLength).SetWriteBufferSize(SocketOption.UDPMaxLength).SetTimeOut(5000).Build());_udpServer.OnAccepted += _udpServer_OnAccepted;_udpServer.OnDisconnected += _udpServer_OnDisconnected;_udpServer.OnReceive += _udpServer_OnReceive;}public void Start(){_udpServer.Start();}public void Stop(){_udpServer.Stop();}private void _udpServer_OnReceive(ISession currentSession, byte[] data){Parallel.ForEach(_cache.Keys, (id) =>{try{_udpServer.SendAsync(id, data);}catch { }});}private void _udpServer_OnAccepted(object obj){var ut = (IUserToken)obj;if (ut != null){_cache.TryAdd(ut.ID, ut);}}private void _udpServer_OnDisconnected(string ID, Exception ex){_cache.TryRemove(ID, out IUserToken _);}}
}

(5)解码还原,客户端将从服务器收到的数据按约定的压缩格式,进行解压缩还原成音频数据

private readonly BufferedWaveProvider _waveProvider;
_waveProvider = new BufferedWaveProvider(_speexCodec.RecordFormat);private void _audioClient_OnReceive(byte[] data)
{byte[] decoded = _speexCodec.Decode(data, 0, data.Length);_waveProvider.AddSamples(decoded, 0, decoded.Length);
}

(6)播放音频,使用播放设备来播放解码后的音频数据

private readonly IWavePlayer _waveOut;
_waveOut = new WaveOut();
_waveOut.Init(_waveProvider);
_waveOut.Play();

三、测试运行,通过分析c#教程语音聊天的几个关键问题点后,按步骤封装好代码,接下来就是用实例来测试一下效果了。
客户端封装在按钮事件中:

GAudioClient _gAudioClient = null;private void toolStripDropDownButton2_ButtonClick(object sender, EventArgs e)
{if (_gAudioClient == null){ClientConfig clientConfig = ClientConfig.Instance();_gAudioClient = new GAudioClient(clientConfig.IP, clientConfig.Port + 2);_gAudioClient.Start();}else{_gAudioClient.Dispose();_gAudioClient = null;}
}

服务端封装在main函数中:

ConsoleHelper.WriteLine("正在初始化语音服务器...", ConsoleColor.DarkBlue);
_gAudioServer = new GAudioServer(filePort + 1);
ConsoleHelper.WriteLine("语音服务器初始化完毕...", ConsoleColor.DarkBlue);
ConsoleHelper.WriteLine("正在启动语音服务器...", ConsoleColor.DarkBlue);
_gAudioServer.Start();
ConsoleHelper.WriteLine("语音服务器初始化完毕", ConsoleColor.DarkBlue);

万事俱备,现在F5跑起来试试。

如上红框所示,喊了几句相当于Hello World的Hello没有问题,大功初步告成~

原文作者:https://www.cnblogs.com/yswenli/p/14353482.html
更多内容欢迎我的的github:https://github.com/yswenli/GFF
如果发现本文有什么问题和任何建议,也随时欢迎交流~

以上就是c# 实现语音聊天的实战示例的详细内容

c# 实现语音聊天的实战示例相关推荐

  1. python实现语音通话_python 实现语音聊天机器人的示例代码

    前言 在不远的将来,实现一定程度上的语音支持将成为日常科技的基本要求,整合了语音识别的python程序提供了其他技术无法比拟的交互性和可访问性.最重要的是,在python程序中实现语音识别非常简单.整 ...

  2. h5语音聊天audio实战|仿微信语音效果|h5即时聊天系统

    最近一段时间不是那么忙,就抽空整理了下之前的项目,因为之前有开发过H5聊天项目,只是觉得好些功能都没有特别的完善,所以就把之前项目重新开发了下,如是就有了这个html5版实时聊天语音项目weChatI ...

  3. Docker快速搭建TeamSpeak多人语音聊天服务器

    Docker快速搭建TeamSpeak多人语音聊天服务器 第一步执行: git clone https://github.com/overshard/docker-teamspeak cd docke ...

  4. ios开发 多人语音聊天_客户端实现(iOS)

    客户端实现(iOS) 本文档为您展示通过 SDK 实现语音聊天室场景的相关步骤,帮助您在业务中实现麦位管理.低延时语音互动.文字聊天等 IM 和音视频通话 2.0 在语音聊天场景下的相关能力. 前提条 ...

  5. java 语音聊天室

    javaSound的开源实现:http://www.tritonus.org/ 最近准备做个语音聊天室,困难很多.以后会在这里不断加入相关资源和开发进展. 语音api原理 一个游戏软件中使用的 语音 ...

  6. unity语音聊天--亲加通讯云(Android/iOS)---android

    注:最近项目需求要做语音聊天这一块的功能,想了几种方案,最后还是决定用第三方服务,毕竟日活50W以下亲加是免费的! 亲加官方给了一定的技术文档,但是遇到很多坑,我顺便都介绍一下 废话不多说,先介绍An ...

  7. ios开发 多人语音聊天_iOS-实现多人语音聊天室-场景实践-音视频通话2.0-网易云信开发文档...

    云信多人语音聊天室(iOS) 这个开源示例项目演示了如何快速集成NERTC SDK,快速实现多人语音聊天室功能. 功能介绍 该示例项目中包含了以下功能: 创建语音聊天室: 使用文字或语音进行多对多互动 ...

  8. Android端实现多人视频语音聊天|音视频开发

    1 多人视频通话功能 本文展示了如何使用 即构实时音视频SDK ZEGO Express SDK 构造多人视频通话场景,即实现多对多实时音视频互动.用户可在房间内与其余用户进行实时视频通话,互相推拉流 ...

  9. 试用php语言写气泡,如何用纯CSS实现语音聊天气泡框效果

    本篇文章主要给大家介绍怎么用纯css实现语音聊天气泡框效果. 推荐参考教程:<CSS教程> 语音聊天气泡框效果,在我们日常生活中或者社交网站上,都是非常常见且流行的一种对话框效果. 比如微 ...

最新文章

  1. 列表CheckBox全选 结合DataGrid 进行删除操作
  2. mysql二级索引_mysql——二级索引(辅助索引)
  3. 如何才能加深对Linux概念架构的理解
  4. JSP+Servlet + JDBC 实现简单的登录验证模块
  5. 五分钟了解先验概率和后验概率
  6. 承博士:让云计算落地生根的中国云计算平台
  7. 第14课 跳绳达人 《小学生C++趣味编程》
  8. 两个 Integer 数值之间不建议使用 “==” 进行比较
  9. 编写一个以C 语言为基础的DSP程序
  10. 加拿大女王大学计算机排名,加拿大女王大学排名世界排名是第几
  11. [USACO06NOV]玉米田Corn Fields
  12. spring源码解析--环境搭建
  13. 通过 irp 请求包删除文件
  14. 北京社保医院选择办法-附A类医保定点医院名单
  15. 每一个数据分析师都要掌握的方法:多维度分析法
  16. Facebook sdk嵌入,登陆与注销
  17. 从小米手环4看雷军的AIOT思路进化
  18. CES包罗万象 家用清洁机器人将亮相展会
  19. Spring boot项目实现跨域,java
  20. 【已解决】win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。

热门文章

  1. 耳机的全场景智慧时代:华为登场,鸿蒙将开
  2. Unity 流光shader 记录分享
  3. 2018.12.10:中断三个月的python学习又接上了
  4. 如何上传图片裁剪(2种方法)
  5. Python字典遍历删除特定值
  6. 英雄联盟是基于c语言开发的吗,英雄联盟 和设计师作对的4个英雄: 原本想让他们c, 却成了辅助...
  7. 求生意志服务器列表为空,第五人格:共研服更新天赋!不改“求生意志”却调整“好奇心”...
  8. Javascript 混淆后解码原理
  9. 28条讨人喜欢的原则
  10. 从深交所2018年创新课题看券商的数智化布局