servidor - socket udp java
¿Cómo enviar transmisiones de audio a través de UDP en Java? (1)
No hace qué clase de jugador aquí, quiere usar las clases en javax.sound.sampled . Por lo que puedo decir, Player es por reproducir un sonido, no acceder a sus contenidos.
No he probado esto, pero intente usar .read en la TargetDataLine que está creando para llenar un búfer, y luego enviar el búfer al otro host.
Tengo un problema, configuré MediaLocator en la entrada del micrófono y luego creé Player. Necesito tomar ese sonido del micrófono, codificarlo en un flujo de calidad inferior y enviarlo como un paquete de datagramas a través de UDP. Aquí está el código, encontré la mayor parte en línea y lo adapté a mi aplicación:
public class AudioSender extends Thread {
private MediaLocator ml = new MediaLocator("javasound://44100");
private DatagramSocket socket;
private boolean transmitting;
private Player player;
TargetDataLine mic;
byte[] buffer;
private AudioFormat format;
private DatagramSocket datagramSocket(){
try {
return new DatagramSocket();
} catch (SocketException ex) {
return null;
}
}
private void startMic() {
try {
format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 16, 2, 4, 8000.0F, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
mic = (TargetDataLine) AudioSystem.getLine(info);
mic.open(format);
mic.start();
buffer = new byte[1024];
} catch (LineUnavailableException ex) {
Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
}
}
private Player createPlayer() {
try {
return Manager.createRealizedPlayer(ml);
} catch (IOException ex) {
return null;
} catch (NoPlayerException ex) {
return null;
} catch (CannotRealizeException ex) {
return null;
}
}
private void send() {
try {
mic.read(buffer, 0, 1024);
DatagramPacket packet =
new DatagramPacket(
buffer, buffer.length, InetAddress.getByName(Util.getRemoteIP()), 91);
socket.send(packet);
} catch (IOException ex) {
Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run() {
player = createPlayer();
player.start();
socket = datagramSocket();
transmitting = true;
startMic();
while (transmitting) {
send();
}
}
public static void main(String[] args) {
AudioSender as = new AudioSender();
as.start();
}
}
Y lo único que sucede cuando ejecuto la clase de receptor es si escucho este reproductor de la clase de remitente. Y no puedo ver la conexión entre TargetDataLine y Player. Básicamente, necesito obtener el reproductor de sonido y de alguna forma convertirlo a bytes [], por lo tanto puedo enviarlo como datagrama. ¿Algunas ideas? Todo es aceptable, siempre y cuando funcione :)