c反应蛋白高说明什么(c在意大利)

一、前言

语音聊天专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点:

1、时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会好很多,延迟低,并且能够第·一时间与听众互动,时效性强。

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

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

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

二、语音聊天

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

C#用6步实现语音聊天(可仿qq、微信)

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

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();

三、测试运行

通过分析语音聊天的几个关键问题点后,按步骤封装好代码,接下来就是用实例来测试一下效果了。

客户端封装在按钮事件中:

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跑起来试试。

C#用6步实现语音聊天(可仿qq、微信)

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 6月 9日 上午10:12
下一篇 2023年 6月 9日 上午10:21

相关推荐

  • 哪款记账软件可以记录收入,使用记账软件怎么记录信用卡消费

    很多人总觉得自己的钱很快就花完了,甚至还不知道花在什么地方了,所以记账一个很有必要的行为,小编这里为大家带来了记录收支的方法,有效的记录自己的收支情况,更好地管理自己的收支,一起来…

    2023年 8月 10日
  • 示波器的原理和使用方法

    在数字电路实验中,需要使用若干仪器、仪表观察实验现象和结果。常用的电子测量仪器有万用表、逻辑笔、普通示波器、存储示波器、逻辑分析仪等。万用 表和逻辑笔使用方法比较简单,而逻辑分析仪…

    2023年 9月 16日
  • 神武4手游新手封系怎么玩,神武4手游封系攻略

    无忧拌吉祥,神武乐逍遥!各位小伙伴们大家好,你们的小可爱吉祥又来了。 在《神武4》手游中,决定一件装备优良的因素除了属性以外,“红字”也是需要关注的重点。红字特效可以进一步提升属性…

    2023年 6月 10日
  • 网络营销专业学什么课程

    随着互联网的兴起,越来越多的互联网用户,也让更多的企业开始选择通过网络营销的方式获得用户,市场的人才需求也是比较大。既然网络营销既有市场又有人群,也让我们好多小伙伴对网络营销感兴趣…

    2023年 4月 16日
  • toto路由器登录网址进不去

    在设置TOTOLINK无线路由器时,192.168.0.1登录页面打不开的解决办法。正常情况下,一台未经过设置的TOTOLINK路由器,当把电脑连接到TOTOLINK路由器的LAN…

    2023年 6月 4日
  • 电脑安装字体的方法有哪些

    除了windows系统中自带的字体外,用户还可以自行安装,字体已在文字编辑上更胜一筹,字体安装方法主要有三种。 1)右键进行安装,选择要安装的字体,单击鼠标右键,在弹出的快捷菜单中…

    2023年 4月 12日
  • 如何用cad自定义线段宽度和绘制标注箭头

    一、自定义宽度线段绘制 1、点击CAD命令栏中“多段线”按钮,在界面中点击线段起始位置; 2、在CAD对话栏中输入“W”,目的是指定线段的宽度,比如“25”,回车; 3、在CAD对…

    2023年 5月 11日
  • 如何让自己网店搜索排名靠前,怎么提高网店搜索排名

    手机端搜索排名-赤云电。有这个朋友说手机端的搜索排名比较低,甚至这个根本就搜不到。名。搜索用户点击进店(点击)。去提升手机端的搜索排名呢力。 其实如果说你想去提升,主要从两点来考虑…

    2023年 5月 24日
  • matlab2016a中文版安装详细步骤,matlab2018a安装教程详细版

    安装步骤: 1.如图所示,完整的安装包应该有13个压缩包,必须要全部下载完成才能解压。鼠标右击“thMWoMaR17a.part01.rar”压缩包,选择“解压到thMWoMaR1…

    2022年 12月 23日
  • 绝地求生近期活动送饰品福利(绝地求生最新活动代币)

    本文由“C5GAME”特约。 《绝地求生》官方又悄悄在国外推出了活动。 这次游戏官方活动是竞猜游戏比赛吃鸡战队,送绝版《绝地求生》的游戏PGI服装! 直播间叫 playBATTLE…

    2023年 7月 22日