一、语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点:
(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. samba mv命令出错
  2. python安装cv-oracle时如何解决vc++的问题_python中cx_Oracle模块安装遇到的问题与解决方法...
  3. GraphQL入门之Schema和类型规范
  4. 欢乐纪中某B组赛【2019.1.25】
  5. appium和selenium不同与相同之处
  6. String类常用方法记录
  7. cocos2d JS 源生js实现each方法
  8. java collection 常用类_分析Collection常用的实现类
  9. 产品经理是怎样炼成的
  10. 初中计算机教案ps,第三课 利用Adobe Photoshop工具处理图片
  11. LINUX使用消息队列的代码
  12. LightTable:更改Julia代码字体和console中字体
  13. oracle对某两列求和再求和_分手后4个阶段这样挽回,再狠的他也会心软求和
  14. 移动端APP第一次登录和自动登录流程
  15. html img图片不变形等比例缩放,兼容ie6
  16. 【学习笔记之Linux】工具之gcc/g++
  17. navicat导出数据库数据
  18. 【安全攻防系列 Windows实战】教你如何 FTP暴力破解、四大病毒勒索病毒、蠕虫病毒、ARP病毒、挖矿病毒,怎么处理应急场景
  19. 《抽样技术》第4章 等概率整群抽样和多阶段抽样
  20. win10 打开策略组关闭系统自动更新

热门文章

  1. 丁达尔效应产生的原因_为什么丁达尔效应产生的通路是乳白色的?
  2. leetcode股票买卖问题全解(转载他人)
  3. 新仙魔九界研发及设计分析
  4. 深夜看完张一鸣500条微博,惊呆了:原来大佬的隐退,早有预谋!
  5. 记录解决问题--人大金仓sys_dump: error: connection to database or services “xxx“ failed: 致命错误: 用户 “system“
  6. php imagegif 动画,使用PHP的ImageMagick API制作动画GIF
  7. bzoj2142 礼物
  8. 工业互联网 第1章 什么是工业互联网?
  9. 【Kay】1 数据仓库简介
  10. soapui工具_Java 开发者不容错过的 12 种高效工具