socket servidor para librerias comunicacion cliente java audio stream microphone datagram

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 :)