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

相关推荐

  • c盘windows文件夹哪些可以删除,电脑c盘哪些文件夹可以删除

    这里说的C盘是指我们电脑的系统文件夹,许多人平时在使用电脑的时候,可能没有很好的呵护我们的电脑,所以导致系统盘爆满,从而导致电脑变得非常卡。这是重装电脑仿佛成了最好的选择,但其实重…

    2022年 12月 22日
  • 西游记之思维导图

    《悟空传》、《西游伏妖篇》、《大闹天竺》、《大闹天宫》、《嘻游记》、《情癫大圣》、《西行平妖》、《大话西游之月光宝盒》 、《大话西游记之篇仙履奇缘》、《大圣归来》、《西游记之孙悟空…

    2023年 9月 16日
  • steam怎么白嫖好友的游戏还可以一起玩

    【多玩网10月10日讯】SteamWorks网站上公布Steam一项名为“Remote Play Together”的功能,Steam内部员工近日公开分享了“Remote Play…

    2023年 1月 4日
  • 搜狗地图不更新可以继续使用吗(搜狗地图下线了怎么还能用)

    IT之家 5 月 11 日消息,搜狗地图官网显示,搜狗地图将于 2022 年 5 月 15 日 23 点正式下线,届时关闭所有相关服务,并建议用户下载腾讯地图。 IT之家获悉,腾讯…

    2023年 1月 31日
  • 抖音全民任务流量奖励是怎么算的

    今天抖音全民活动赠送流量,别再抱怨拍抖音没有流量啦!现在机会来了,一定要抓住!废话不多说,我来手把手教你们三个方法,记得点赞、收藏或者转发到自己手机里,今天一次性讲完。 首先打开抖…

    2023年 10月 29日
  • 手机qq聊天记录删除怎么恢复回来

    在使用QQ的过程中,无法避免误删了一些重要的聊天记录,而使用QQ的大多数原因都是因为微信无法传送大存储量的文件,所以很多人都会利用QQ来传送文件,手机QQ聊天记录删除了怎么恢复?面…

    2023年 1月 10日
  • 家里的wifi已连接但是无法访问互联网是怎么回事

    【搞机百科】家里的wifi总是“已连接但无法访问互联网”怎么回事? 家里的wifi总是“已连接但无法访问互联网”怎么回事?这个问题说难不难,简单几步就能排查出问题的。 首先咱们要了…

    2022年 12月 29日
  • 锐程cc功能键图解大全

    1、锐程CC胎压怎么复位? 解答:锐程CC胎压灯亮起时,需要检查胎压是否正常,当胎压过低或者胎压过高时会亮起胎压故障灯,确保胎压标准的情况下,行驶5-10分钟就会自动进行胎压复位,…

    2023年 9月 24日
  • 如何在拼多多做社交电商运营模式

    本文笔者将从内容运营、数据运营以及用户运营等几个产品运营角度来分析对拼多多进行分析,并对其运营中的一些不足之处提出自己的看法和优化建议。 产品介绍 1. 产品概述 拼多多,拼单类社…

    2023年 5月 14日
  • 教你不用流量不用网络的手机导航

    手机不用流量也能导航了,免费又方便,老年人也要学会步行导航用得到! 现在我们出门使用手机导航很方便,但是很多人反映导航特别费流量,耗电也快。其实你知道吗?手机不用流量也能导航,我们…

    2023年 8月 4日