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);
}
}
}
最近のエントリ
- 日本のIPv6採用状況が50%を超えている件について
- 「ピアリング戦記」の英訳版EPUBを無料配布します!
- IPv4アドレス移転の売買価格推移および移転組織ランキング100
- 例示用IPv6アドレス 3fff::/20 が新たに追加
- ShowNet 2024のL2L3
- ShowNet 2024 ローカル5G
過去記事