示例#1
0
        //UDPパケットを受け付け開始
        private async Task StartReceiveAudioPacketAsync(BufferedWaveProvider provider)
        {
            //G.722コーデックを用意
            var codec      = new NAudio.Codecs.G722Codec();
            var codecState = new NAudio.Codecs.G722CodecState(64000, NAudio.Codecs.G722Flags.None);

            //UdpClientを作成し、ローカルエンドポイントにバインドする
            var localEP = new IPEndPoint(IPAddress.Any, LocalPort);

            using (var udp = new System.Net.Sockets.UdpClient(localEP))
            {
                IPEndPoint remoteEP = null;

                for (;;)
                {
                    //データを受信する
                    while (udp.Available > 0)
                    {
                        byte[]  rcvBytes      = udp.Receive(ref remoteEP);
                        short[] bufferedData  = new short[350];
                        int     bufferdLength = codec.Decode(codecState, bufferedData, rcvBytes, rcvBytes.Length);
                        byte[]  bufferdBytes  = ConvertShortTo16Bit(bufferedData, bufferdLength);

                        //バッファに追加
                        provider.AddSamples(bufferdBytes, 0, bufferdBytes.Length);
                    }
                    await Task.Delay(10);
                }
            }
        }
示例#2
0
        static void Main(string[] args)
        {
            //接続先のIPアドレスを入力
            Console.Write("接続先IPアドレス:");
            string remoteHost = Console.ReadLine();

            //String型のIPアドレスをIPAddress型にParse
            IPAddress remoteAddress;

            if (IPAddress.TryParse(remoteHost, out remoteAddress) == false)
            {
                Console.WriteLine("正しくないIPアドレスが入力されました");

                // 終了
                Environment.Exit(-1);
            }

            //IPエンドポイントを生成
            var remoteEndPoint = new IPEndPoint(remoteAddress, remotePort);
            var localEndPoint  = new IPEndPoint(IPAddress.Any, localPort);

            //UdpClientオブジェクトを生成
            var udp = new System.Net.Sockets.UdpClient(localEndPoint);

            using (var waveIn = new WaveInEvent())
            {
                //総送信バイト数を保持する変数
                long count = 0;

                //入力バッファのサイズを設定(20ms)
                waveIn.BufferMilliseconds = 20;

                //G.722コーデックを用意
                var codec      = new NAudio.Codecs.G722Codec();
                var codecState = new NAudio.Codecs.G722CodecState(64000, NAudio.Codecs.G722Flags.None);

                //音声データ利用可能時の処理(非同期)
                waveIn.DataAvailable += async(_, e) =>
                {
                    //-- 送信処理 --
                    byte[] bufferedBytes = new byte[e.BytesRecorded];
                    Array.Copy(e.Buffer, bufferedBytes, e.BytesRecorded);

                    short[] bufferedData  = Convert16BitToShort(bufferedBytes);
                    byte[]  encodedBytes  = new byte[e.BytesRecorded];
                    int     encodedLength = codec.Encode(codecState, encodedBytes, bufferedData, bufferedData.Length);

                    byte[] bufferToSend = new byte[bufsize];

                    for (int i = 0; i < encodedLength; i += bufsize)
                    {
                        if (encodedLength > i + bufsize)
                        {
                            //バッファ内のデータがペイロードサイズ以上
                            Array.Copy(encodedBytes, i, bufferToSend, 0, bufsize);
                            await udp.SendAsync(bufferToSend, bufferToSend.Length, remoteEndPoint);
                        }
                        else
                        {
                            //バッファ内のサイズがペイロードサイズ以下
                            Array.Copy(encodedBytes, i, bufferToSend, 0, encodedLength - i);
                            await udp.SendAsync(bufferToSend, encodedLength - i, remoteEndPoint);
                        }
                    }

                    count += encodedLength;
                    Console.WriteLine(count);

                    await Task.Delay(10);
                };

                //入力フォーマット設定(16kHz, 16bit, 1ch)
                waveIn.WaveFormat = new WaveFormat(16000, 16, 1);

                //音声の取得開始
                waveIn.StartRecording();

                Console.WriteLine("Press ENTER to quit...");
                Console.ReadLine();

                //音声の取得終了
                waveIn.StopRecording();
            }

            udp.Close();

            Console.WriteLine("Program ended successfully.");
        }
示例#3
0
        /// <summary>
        /// UDP音声パケットの送信を開始します
        /// </summary>
        /// <param name="remoteAddress">リモートIPアドレス</param>
        /// <param name="cancellTokenSource">受信を停止するためのCancellationTokenSource</param>
        /// <returns></returns>
        public async Task StartSendAsync(IPAddress remoteAddress, CancellationTokenSource cancellTokenSource)
        {
            //IPエンドポイントを生成
            var remoteEndPoint = new IPEndPoint(remoteAddress, RemotePort);
            var localEndPoint  = new IPEndPoint(IPAddress.Any, LocalPort);

            //UdpClientオブジェクトを生成
            var udp = new System.Net.Sockets.UdpClient(localEndPoint);

            using (var waveIn = new WaveInEvent())
            {
                //入力バッファのサイズを設定(20ms)
                waveIn.BufferMilliseconds = 20;

                //G.722コーデックを用意
                var codec      = new NAudio.Codecs.G722Codec();
                var codecState = new NAudio.Codecs.G722CodecState(64000, NAudio.Codecs.G722Flags.None);

                //音声データ利用可能時の処理(非同期)
                waveIn.DataAvailable += async(_, e) =>
                {
                    //-- 送信処理 --
                    byte[] bufferedBytes = new byte[e.BytesRecorded];
                    Array.Copy(e.Buffer, bufferedBytes, e.BytesRecorded);

                    short[] bufferedData  = Convert16BitToShort(bufferedBytes);
                    byte[]  encodedBytes  = new byte[e.BytesRecorded];
                    int     encodedLength = codec.Encode(codecState, encodedBytes, bufferedData, bufferedData.Length);

                    byte[] bufferToSend = new byte[MaxPacketPayloadSize];

                    for (int i = 0; i < encodedLength; i += MaxPacketPayloadSize)
                    {
                        if (encodedLength > i + MaxPacketPayloadSize)
                        {
                            //バッファ内のデータがペイロードサイズ以上
                            Array.Copy(encodedBytes, i, bufferToSend, 0, MaxPacketPayloadSize);
                            await udp.SendAsync(bufferToSend, bufferToSend.Length, remoteEndPoint);
                        }
                        else
                        {
                            //バッファ内のサイズがペイロードサイズ以下
                            Array.Copy(encodedBytes, i, bufferToSend, 0, encodedLength - i);
                            await udp.SendAsync(bufferToSend, encodedLength - i, remoteEndPoint);
                        }
                    }
                    await Task.Delay(10);
                };

                //入力フォーマット設定(16kHz, 16bit, 1ch)
                waveIn.WaveFormat = new WaveFormat(16000, 16, 1);

                //音声の取得開始
                waveIn.StartRecording();

                while (true)
                {
                    if (cancellTokenSource.IsCancellationRequested)
                    {
                        break;
                    }
                    await Task.Delay(100);
                }

                //音声の取得終了
                waveIn.StopRecording();
            }
            udp.Close();
        }