RTP y RTSP con Java, parte 2: Gestión del hardware
Antes de empezar, vamos a investigar cómo podemos coger audio del micrófono y enivar audio al altavoz del ordenador. Lo haremos analizando directamente unos fragmentos de código, que es la mejor forma de ver éstas cosas
Recibiendo audio desde el micro
Usaremos el código siguiente para recibir desde el micro. En los comentarios se explican los detalles de las operaciones que se realizan y los recursos que se utilizan.
// Especificamos el formato
AudioFormat formato=new AudioFormat(this.sampleRate, 16, 1, true, true);
// Accedemos a la línea de entrada desde el AudioSystem
DataLine.Info info = new DataLine.Info(TargetDataLine.class, formato);
if (AudioSystem.isLineSupported(info))
{
// Cogemos y abrimos la línea de entrada
TargetDataLine lineaEntrada =
(TargetDataLine) AudioSystem.getLine(info);
lineaEntrada.open(formato);
lineaEntrada.start();
// Creamos el buffer intermedio
int tamBuffer=lineaEntrada.getBufferSize()/5;
byte[] buffer=new byte[tamBuffer];
while(!this.finalizar)
{
// Miramos si hay algo que leer
int bytesDisp = lineaEntrada.available();
if(bytesDisp > 0)
{
tamBufferActual =
(bytesDisp > tamBuffer ? tamBuffer : bytesDisp);
lineaEntrada.read(this.buffer, 0, tamBufferActual);
}
}
// Cerramos el stream
lineaEntrada.close();
}
Enviando audio al altavoz
Usaremos el código siguiente para recibir desde el micro. De nuevo, en los comentarios se explican los detalles de las operaciones que se realizan y los recursos que se utilizan.
// Especificamos el formato
AudioFormat formato=new AudioFormat(this.sampleRate, 16, 1, true, true);
// Accedemos a la línea de salida desde el AudioSystem
DataLine.Info info = new DataLine.Info(SourceDataLine.class, formato);
if (AudioSystem.isLineSupported(info))
{
// Cogemos y abrimos la línea de salida
lineaSalida = (SourceDataLine) AudioSystem.getLine(info);
lineaSalida.open(formato);
lineaSalida.start();
// Creamos el buffer intermedio
int tamBuffer=lineaSalida.getBufferSize()/5;
byte[] buffer=new byte[tamBuffer];
while(!this.finalizar)
{
lineaSalida.write(this.buffer, 0, tamBufferActual);
}
// Cerramos el stream
lineaSalida.close();
}
Conclusión
Como podemos ver, con las clases que están en javax.sound.sampled.* podemos acceder a el hardware de sonido de forma sencilla. Con los mixers que nos ofrece podremos acceder a diferentes micros y dispositivos de salida, y con hebras y buffers intermedios podremos convertir, guardar, emitir, etc… cualquier tipo de audio capturaro, simultáneamente.
Próximamente veremos como codificar esos datos de audio capturados en paquetes RTSP, y como recibir datos de un equipo remoto y volcarlos a través del altavoz convertidos en audio.
¡Suscribete al feed RSS!