一、语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点:
(2)隐私性:这一点体现在何处,如主播不想暴露自己的长相,或者进行问题回答是,没有视频的话会让主播感到更安心,所以语音直播隐私性更强。
(3)内容质量高:因为语音直播不靠“颜值”只有好的内容才能够吸引用户,所以语音直播相对来说内容质量更高。
(4)成本降低:语音直播相对视频直播来说,带宽流量等都会便宜许多,成本降低不少,更加实惠。
二、语音聊天主要步骤:音频采集、压缩编码、网络传输、解码还原、播放音频,如下图所示
下面就从代码的角度来详说一下这几个步骤。
(1)音频采集,读取麦克风设备数据
1privatereadonlyWaveIn_waveIn;2_waveIn=newWaveIn();3_waveIn.BufferMilliseconds=50;4_waveIn.DeviceNumber=0;5_waveIn.DataAvailable+=OnAudioCaptured;6_waveIn.StartRecording();(2)音频数据压缩编码,常见压缩格式比较多,例如mp3、acc、speex等,这里以speex为例
1privatereadonlyWideBandSpeexCodec_speexCodec;2_speexCodec=newWideBandSpeexCodec();3_waveIn.WaveFormat=_speexCodec.RecordFormat;45voidOnAudioCaptured(objectsender,WaveInEventArgse)6{7byte[]encoded=_speexCodec.Encode(e.Buffer,0,e.BytesRecorded);8_audioClient.Send(encoded);9}(3)网络传输,为了保证即时传输udp协议有着天然的优点
1privatereadonlyBufferedWaveProvider_waveProvider;2_waveProvider=newBufferedWaveProvider(_speexCodec.RecordFormat);34privatevoid_audioClient_OnReceive(byte[]data)5{6byte[]decoded=_speexCodec.Decode(data,0,data.Length);7_waveProvider.AddSamples(decoded,0,decoded.Length);8}(6)播放音频,使用播放设备来播放解码后的音频数据
1privatereadonlyIWavePlayer_waveOut;2_waveOut=newWaveOut();3_waveOut.Init(_waveProvider);4_waveOut.Play();三、测试运行,通过分析语音聊天的几个关键问题点后,按步骤封装好代码,接下来就是用实例来测试一下效果了。
客户端封装在按钮事件中:
1GAudioClient_gAudioClient=null;23privatevoidtoolStripDropDownButton2_ButtonClick(objectsender,EventArgse)4{5if(_gAudioClient==null)6{7ClientConfigclientConfig=ClientConfig.Instance();8_gAudioClient=newGAudioClient(clientConfig.IP,clientConfig.Port+2);9_gAudioClient.Start();10}11else12{13_gAudioClient.Dispose();14_gAudioClient=null;15}16}服务端封装在main函数中:
1ConsoleHelper.WriteLine("正在初始化语音服务器...",ConsoleColor.DarkBlue);2_gAudioServer=newGAudioServer(filePort+1);3ConsoleHelper.WriteLine("语音服务器初始化完毕...",ConsoleColor.DarkBlue);4ConsoleHelper.WriteLine("正在启动语音服务器...",ConsoleColor.DarkBlue);5_gAudioServer.Start();6ConsoleHelper.WriteLine("语音服务器初始化完毕",ConsoleColor.DarkBlue);万事俱备,现在F5跑起来试试。
如上红框所示,喊了几句相当于HelloWorld的Hello没有问题,大功初步告成~