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)!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C#을 사용한 Active Directory 가이드. 여기에서는 소개와 구문 및 예제와 함께 C#에서 Active Directory가 작동하는 방식에 대해 설명합니다.

C#의 난수 생성기 가이드입니다. 여기서는 난수 생성기의 작동 방식, 의사 난수 및 보안 숫자의 개념에 대해 설명합니다.

C# 데이터 그리드 뷰 가이드. 여기서는 SQL 데이터베이스 또는 Excel 파일에서 데이터 그리드 보기를 로드하고 내보내는 방법에 대한 예를 설명합니다.

멀티 스레딩과 비동기식의 차이점은 멀티 스레딩이 동시에 여러 스레드를 실행하는 반면, 현재 스레드를 차단하지 않고 비동기식으로 작업을 수행한다는 것입니다. 멀티 스레딩은 컴퓨팅 집약적 인 작업에 사용되며 비동기식은 사용자 상호 작용에 사용됩니다. 멀티 스레딩의 장점은 컴퓨팅 성능을 향상시키는 것이지만 비동기의 장점은 UI 스레드를 차단하지 않는 것입니다. 멀티 스레딩 또는 비동기식을 선택하는 것은 작업의 특성에 따라 다릅니다. 계산 집약적 작업은 멀티 스레딩을 사용하고 외부 리소스와 상호 작용하고 UI 응답 성을 비동기식으로 유지 해야하는 작업을 사용합니다.
