L16をUDPで送受信するJavaサンプルを書いてみた
何となく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);
}
}
}
最近のエントリ
- Interop 2023のShowNetバックボーン詳解
- Interop Tokyo 2023 ShowNet取材動画
- 「ピアリング戦記 - 日本のインターネットを繋ぐ技術者たち」を書きました!
- 1.02Tbpsの対外線!400GbE相互接続も - Interop ShowNet 2022
- Alaxala AX-3D-ViewerとAX-Sensor - Interop 2022
- SRv6を活用し、リンクローカルIPv6アドレスだけでバックボーンのルーティング - Interop ShowNet 2022
過去記事