C#基于UDP实现的P2P语音聊天工具
发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,今天就跟大家聊聊有关C#基于UDP实现的P2P语音聊天工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。主要是一个应用,使用udp传送语音和文
千家信息网最后更新 2024年09月25日C#基于UDP实现的P2P语音聊天工具
今天就跟大家聊聊有关C#基于UDP实现的P2P语音聊天工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
主要是一个应用,使用udp传送语音和文本等信息。在这个系统中没有服务端和客户端,相互通讯都是直接相互联系的。能够很好的实现效果。
语音获取
要想发送语音信息,首先得获取语音,这里有几种方法,一种是使用DirectX的DirectXsound来录音,我为了简便使用一个开源的插件NAudio来实现语音录取。 在项目中引用NAudio.dll
//------------------录音相关----------------------------- private IWaveIn waveIn; private WaveFileWriter writer; private void LoadWasapiDevicesCombo() { var deviceEnum = new MMDeviceEnumerator(); var devices = deviceEnum.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active).ToList(); comboBox1.DataSource = devices; comboBox1.DisplayMember = "FriendlyName"; } private void CreateWaveInDevice() { waveIn = new WaveIn(); waveIn.WaveFormat = new WaveFormat(8000, 1); waveIn.DataAvailable += OnDataAvailable; waveIn.RecordingStopped += OnRecordingStopped; } void OnDataAvailable(object sender, WaveInEventArgs e) { if (this.InvokeRequired) { this.BeginInvoke(new EventHandler(OnDataAvailable), sender, e); } else { writer.Write(e.Buffer, 0, e.BytesRecorded); int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond); if (secondsRecorded >= 10)//***10s { StopRecord(); } else { l_sound.Text = secondsRecorded + " s"; } } } void OnRecordingStopped(object sender, StoppedEventArgs e) { if (InvokeRequired) { BeginInvoke(new EventHandler (OnRecordingStopped), sender, e); } else { FinalizeWaveFile(); } } void StopRecord() { AllChangeBtn(btn_luyin, true); AllChangeBtn(btn_stop, false); AllChangeBtn(btn_sendsound, true); AllChangeBtn(btn_play, true); //btn_luyin.Enabled = true; //btn_stop.Enabled = false; //btn_sendsound.Enabled = true; //btn_play.Enabled = true; if (waveIn != null) waveIn.StopRecording(); //Cleanup(); } private void Cleanup() { if (waveIn != null) { waveIn.Dispose(); waveIn = null; } FinalizeWaveFile(); } private void FinalizeWaveFile() { if (writer != null) { writer.Dispose(); writer = null; } } //开始录音 private void btn_luyin_Click(object sender, EventArgs e) { btn_stop.Enabled = true; btn_luyin.Enabled = false; if (waveIn == null) { CreateWaveInDevice(); } if (File.Exists(soundfile)) { File.Delete(soundfile); } writer = new WaveFileWriter(soundfile, waveIn.WaveFormat); waveIn.StartRecording(); }
上面的代码实现了录音,并且写入文件p2psound_A.wav
语音发送
获取到语音后我们要把语音发送出去
当我们录好音后点击发送,这部分相关代码是
MsgTranslator tran = null; ublic Form1() { InitializeComponent(); LoadWasapiDevicesCombo();//显示音频设备 Config cfg = SeiClient.GetDefaultConfig(); cfg.Port = 7777; UDPThread udp = new UDPThread(cfg); tran = new MsgTranslator(udp, cfg); tran.MessageReceived += tran_MessageReceived; tran.Debuged += new EventHandler(tran_Debuged); } private void btn_sendsound_Click(object sender, EventArgs e) { if (t_ip.Text == "") { MessageBox.Show("请输入ip"); return; } if (t_port.Text == "") { MessageBox.Show("请输入端口号"); return; } string ip = t_ip.Text; int port = int.Parse(t_port.Text); string nick = t_nick.Text; string msg = "语音消息"; IPEndPoint remote = new IPEndPoint(IPAddress.Parse(ip), port); Msg m = new Msg(remote, "zz", nick, Commands.SendMsg, msg, "Come From A"); m.IsRequireReceive = true; m.ExtendMessageBytes = FileContent(soundfile); m.PackageNo = Msg.GetRandomNumber(); m.Type = Consts.MESSAGE_BINARY; tran.Send(m); } private byte[] FileContent(string fileName) { FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); try { byte[] buffur = new byte[fs.Length]; fs.Read(buffur, 0, (int)fs.Length); return buffur; } catch (Exception ex) { return null; } finally { if (fs != null) { //关闭资源 fs.Close(); } } }
如此一来我们就把产生的语音文件发送出去了
语音的接收与播放
其实语音的接收和文本消息的接收没有什么不同,只不过语音发送的时候是以二进制发送的,因此我们在收到语音后 就应该写入到一个文件里面去,接收完成后,播放这段语音就行了。
下面这段代码主要是把收到的数据保存到文件中去,这个函数式我的NetFrame里收到消息时所触发的事件,在文章前面提过的那篇文章里
void tran_MessageReceived(object sender, MessageEventArgs e) { Msg msg = e.msg; if (msg.Type == Consts.MESSAGE_BINARY) { string m = msg.Type + "->" + msg.UserName + "发来二进制消息!"; AddServerMessage(m); if (File.Exists(recive_soundfile)) { File.Delete(recive_soundfile); } FileStream fs = new FileStream(recive_soundfile, FileMode.Create, FileAccess.Write); fs.Write(msg.ExtendMessageBytes, 0, msg.ExtendMessageBytes.Length); fs.Close(); //play_sound(recive_soundfile); ChangeBtn(true); } else { string m = msg.Type + "->" + msg.UserName + "说:" + msg.NormalMsg; AddServerMessage(m); } }
收到语音消息后,我们要进行播放,播放时仍然用刚才那个插件播放
//--------播放部分---------- private IWavePlayer wavePlayer; private WaveStream reader; public void play_sound(string filename) { if (wavePlayer != null) { wavePlayer.Dispose(); wavePlayer = null; } if (reader != null) { reader.Dispose(); } reader = new MediaFoundationReader(filename, new MediaFoundationReader.MediaFoundationReaderSettings() { SingleReaderObject = true }); if (wavePlayer == null) { wavePlayer = new WaveOut(); wavePlayer.PlaybackStopped += WavePlayerOnPlaybackStopped; wavePlayer.Init(reader); } wavePlayer.Play(); } private void WavePlayerOnPlaybackStopped(object sender, StoppedEventArgs stoppedEventArgs) { if (stoppedEventArgs.Exception != null) { MessageBox.Show(stoppedEventArgs.Exception.Message); } if (wavePlayer != null) { wavePlayer.Stop(); } btn_luyin.Enabled = true; }private void btn_play_Click(object sender, EventArgs e) { btn_luyin.Enabled = false; play_sound(soundfile); }
在上面演示了接收和发送一段语音消息的界面
技术总结
主要用到的技术就是UDP和NAudio的录音和播放功能
看完上述内容,你们对C#基于UDP实现的P2P语音聊天工具有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
语音
消息
文件
代码
内容
语音聊天
C#
二进制
信息
技术
插件
文本
篇文章
输入
工具
不同
简便
如此一来
一来
事件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
武汉公司软件开发哪家好
立体车库设计与组态软件开发
ktv一台服务器带多少个点歌机
高清视频录播服务器器
四川服务器虚拟化定做
嵌入式软件开发与设计实验
云服务器能玩梦幻那
暗黑三服务器没带宽
郑州c语言软件开发大概多少钱
老年人网络安全知识宣传
天津科技大学图书馆数据库
济南汉峪金谷软件开发
北京中视华业网络技术
管理软件不用服务器
浏览器和服务器之间的通信过程
如何找回全民奇迹服务器
数据库技术的应用研究
软件开发项目经验教训总结
国家统计局数据库网址
数据库技术新的应用
橘子搭建服务器
jdbc预加载连接数据库
衡水软件开发园
网络安全与执法专业怎样
山西省网络技术考试
互联网科技捡漏
网络安全教育开展总结
服务器运维服务资质
计算机怎么开发软件开发
航天信息数据库