package ar.com.javacuriosities.networking.udp.streaming;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Port;
import javax.sound.sampled.TargetDataLine;
/*
* Este es un ejemplo de envío de streaming de audio por medio de una conexión UDP, en general
* si queremos hacer algo mas real usaremos el protocolo RTSP (Real Time Streaming Protocol), el cual
* suele utilizar UDP para el envío de audio o video y TCP para el envío de datos de control, porque es
* importante recordar que UDP no asegura envío de paquetes ni el orden.
*
* Utilizaremos el Java Sound API, esta API define varios dispositivos (mixers), usualmente al menos tendremos
* uno de entrada y otro de salida
*/
public class AudioSender {
private static final int PORT = 8888;
public static void main(String[] args) {
// Pedimos los mixers de nuestro sistema
Mixer.Info[] mixersInfo = AudioSystem.getMixerInfo();
for (Mixer.Info info : mixersInfo) {
System.out.println("Mixer: " + info);
}
// Los Line están asociados a los mixers, aca verificamos si el micrófono esta asociado a un mixer
if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
// Creamos el socket de envío en cualquier puerto
try (DatagramSocket socket = new DatagramSocket()) {
// Configuramos el destino del audio
InetAddress address = InetAddress.getLocalHost();
// Creamos un DataLine el cual agrega funcionalidades sobre el Line (Métodos de transporte), el TargetDataLine permite leer audio
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, AudioFormatHelper.getAudioFormat());
// Obtenemos la línea
TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
// Abrimos la línea
targetDataLine.open(AudioFormatHelper.getAudioFormat());
// El start permite que la línea empiece a usar I/O
targetDataLine.start();
while (true) {
// Creamos un buffer para leer los datos (Usamos 32000 porque el sample lo pusimos en 8000 y 2 bytes por sample = 16000 por segundo)
byte[] buffer = new byte[32000];
// Leemos y enviamos el audio
targetDataLine.read(buffer, 0, buffer.length);
sendAudio(socket, address, buffer);
}
} catch (Exception e) {
// Log and Handle exception
e.printStackTrace();
}
}
}
private static void sendAudio(DatagramSocket socket, InetAddress address, byte soundpacket[]) {
try {
socket.send(new DatagramPacket(soundpacket, soundpacket.length, address, PORT));
} catch (Exception e) {
// Log and Handle exception (Unable to send soundpacket using UDP)
e.printStackTrace();
}
}
}