概述
原创性申明
此博文的出处 为 http://www.uoften.com/如果进行转载请注明出处。本文作者原创,邮箱zhujunxxxxx@163.com,如有问题请联系作者
概述
之前发过一篇文章http://www.uoften.com/ 已经实现过了UDP的分包发送数据的功能,而这篇文章主要是一个应用,使用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<WaveInEventArgs>(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<StoppedEventArgs>(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
语音发送
获取到语音后我们要把语音发送出去
在上面演示了接收和发送一段语音消息的界面
技术总结
主要用到的技术就是UDP和NAudio的录音和播放功能
以上就是c#基于udp实现的p2p语音聊天工具的内容,更多相关内容请关注靠谱客(www.uoften.com)!
最后
以上就是炙热糖豆为你收集整理的c#基于udp实现的p2p语音聊天工具的全部内容,希望文章能够帮你解决c#基于udp实现的p2p语音聊天工具所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复