집 >백엔드 개발 >C#.Net 튜토리얼 >UDP 기반의 C# p2p 음성 채팅 도구
이 블로그 게시물의 출처는 http://www.php.cn/입니다. 재인쇄시 출처를 꼭 밝혀주세요. 이 글은 작성자의 원본입니다. zhujunxxxxx@163.com으로 이메일을 보내주세요. 질문이 있는 경우 작성자에게 문의하세요
전에 글 올렸습니다http://www.php.cn / 데이터를 패킷으로 보내는 UDP 기능을 구현했으며, 이 글은 주로 UDP를 사용해 음성, 문자 등의 정보를 전송하는 애플리케이션이다. 이 시스템에는 서버와 클라이언트가 없으며, 상호 통신은 서로 직접적으로 연관되어 있습니다. 좋은 결과를 얻을 수 있습니다.
음성 메시지를 보내려면 먼저 음성을 얻어야 합니다. 그 중 하나는 DirectX의 DirectX소리를 녹음하는 방법입니다. 단순함. 음성 녹음을 구현하는 오픈 소스 플러그인 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 파일을 작성합니다
음성받아서 보내야해요
음성을 녹음한 후 보내기를 클릭하세요. 이 부분에 해당하는 코드는
MsgTranslator tran = null; public 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<DebugEventArgs>(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에 메시지가 수신될 때 트리거됩니다.
음성 메시지를 받은 후 재생해야 하는데, 여전히 동일한 플러그인을 사용하여 재생합니다
위에 음성 메시지 수신 및 전송을 위한 인터페이스 시연
주로 사용되는 기술은 UDP 및 NAudio의 녹음 및 재생 기능입니다.
위는 udp 기반으로 C#으로 구현한 p2p 음성채팅 도구의 내용입니다. 더 많은 관련 내용은 PHP를 참고해주세요. 중국사이트(www.php.cn)!