Como permitir que un applet firmado capture audio desde el micrófono

Si al ejecutar una lectura de audio desde el canal del micrófono a través de nuestro applet firmado obtenemos la excepción siguiente:

java.security.AccessControlException: access denied (javax.sound.sampled.AudioPermission record)
at java.security.AccessControlContext.checkPermission (AccessControlContext.java:323)
at java.security.AccessController.checkPermission(Acc essController.java:546)
at java.lang.SecurityManager.checkPermission(Security Manager.java:532)
...

Habrá que buscar (o crear si no existe) el archivo java.policy (a nivel de sistema) o el archivo .java.policy (a nivel de usuario), y editarlo escribiendo algo como lo siguiente:

grant
{
	permission javax.sound.sampled.AudioPermission "record";
};

Y si estáis bajo un Linux (Ubuntu Desktop, en mi caso) y os surge una nueva excepción que dice lo siguiente:

java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.pulse-java)

Habrá que rellenar el archivo .java.policy con lo siguiente:

grant
{
	permission javax.sound.sampled.AudioPermission "record";
	permission java.lang.RuntimePermission "loadLibrary.pulse-java";
    permission java.io.FilePermission "<<ALL FILES>>", "read";
};

¡Espero que os sirva de ayuda! ¡Happy coding!

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 icon smile RTP y RTSP con Java, parte 2: Gestión del hardware

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 &gt; 0)
		{
			tamBufferActual =
				(bytesDisp &gt; 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.

RTP y RTSP con Java, parte 1: Conceptos iniciales

Siguiendo éste manual crearemos una aplicación Java que sea capaz de leer y transmitir flujos RTP y veremos el soporte de éste protocolo usando componentes de una o más librerías multimedia Java, las cuales evaluaremos con éste ejercicio.

Conceptos iniciales

El estandar RTP es un protocolo para enviar contenidos multimedia sobre redes TCP/IP, y RTSP añade un poco de control de sesión al protocolo RTP. Es muy parecido al protocolo HTTP, pero con transmisiones binarias.

Para tener más información sobre el protocolo puedes leer alguna de las páginas siguientes:

Librerías RTP contempladas

Hay varias librerías que nos pueden ayudar a crear nuestro cliente RTSP, entre las que destacan las siguientes:

Varias de ésas librerías están desfasadas o no implementan RTP/RTSP en su totalidad, pero todas tienen algo que nos puede ser de utilidad para nuestro cometido. Pero su valided o no la iremos detallando poco a poco, a medida que vayamos implementado el ejemplo de acceso y emisión de paquetes RTP/RTSP.


Disclaimer: Las imágenes mostradas en ésta página web se utilizan sólamente con propósitos ilustrativos, y son propiedad de sus respectivos autores (cuando es aplicable).
Hijo de Blog es un producto del Dr. SeROne

Los contenidos se ofrecen bajo una licencia de Creative Commons
Attribution-NonCommercial-NoDerivs 3.0 Unported

salvo que se indique lo contrario

Licencia de Creative Commons