//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); } } }
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."); }
/// <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(); }