>  기사  >  백엔드 개발  >  UDP 기반의 C# p2p 음성 채팅 도구

UDP 기반의 C# p2p 음성 채팅 도구

黄舟
黄舟원래의
2018-05-16 16:45:012634검색

독창성 선언

이 블로그 게시물의 출처는 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)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.