L16をUDPで送受信するJavaサンプルを書いてみた

2008/5/14-2

何となくL16オーディオデータを送受信するサーバとクライアントが書きたくなったので書いてみました。 こういうのはCで書くことが多いので、Javaで書くのは初めてです。 お酒が入っているので結構いい加減です。

L16ってビッグエンディアンでPCM 16ビット取ればいいんでしたっけ? 間違っていたらごめんなさい。。。

44.1khzサンプリングで取得した音声データをlocalhostに投げつけています。

そのうち、RTPにでもしてSAP+SDPで広報して、sdr/vat対応してみようかな。。。 なお、やらない可能性も高いのでご注意下さい。



import javax.sound.sampled.*;
import java.net.*;

/** 送信側 */

public class snd {
  public static void main(String[] args) {
    try {
      byte[] buf = new byte[1400];
      DatagramSocket soc = new DatagramSocket();
      DatagramPacket pkt = new DatagramPacket(buf,
                                 buf.length,
                                 InetAddress.getByName("127.0.0.1"),
                                 11111);

      AudioFormat fmt = new AudioFormat(44100.0F, 16, 2, true, true);
      DataLine.Info info = new DataLine.Info(TargetDataLine.class, fmt);
      TargetDataLine targetDataLine = (TargetDataLine)AudioSystem.getLine(info);

      targetDataLine.open(fmt);

      AudioInputStream in = new AudioInputStream(targetDataLine);

      targetDataLine.start();

      while (true) {
        in.read(buf, 0, buf.length);

        soc.send(pkt);
      }
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
  }
}






import javax.sound.sampled.*;
import java.net.*;

/** 受信側 */

public class recv {
  public static void main(String[] args) {
    try {
      byte[] buf = new byte[1400];
      DatagramSocket soc = new DatagramSocket(11111);
      DatagramPacket pkt = new DatagramPacket(buf,buf.length);

      AudioFormat fmt = new AudioFormat(44100.0F, 16, 2, true, true);
      DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
      SourceDataLine srcLine = (SourceDataLine)AudioSystem.getLine(info);

      srcLine.open(fmt);

      srcLine.start();

      while (true) {
        soc.receive(pkt);
        srcLine.write(pkt.getData(), 0, pkt.getData().length);
      }
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
  }
}


最近のエントリ

過去記事

過去記事一覧

IPv6基礎検定

YouTubeチャンネルやってます!