martes, 30 de diciembre de 2014

TEMA #12: SONIDOS

En este tema veremos cómo agregar sonido a una aplicación/juego. Aprenderemos a cómo reproducir sonidos, a pausarlos y otras cosas. Observemos esta primera imagen:
A través de esta imagen lo que quiero explicar es que Manager es la clase principal en este tema y es la que va a permitir crear un Player, el cual va a permitir reproducir audio y video. La clase control, como vemos, es la que está dentro de Manager y Player, y va a permitir controlar los Players que creemos. El import que debemos hacer es: javax.microedition.media.*;


Tipos de Audio y Video
Los archivos de audio y de video tienen diferentes formatos y dependiendo del formato nuestro celular será capaz o no de reproducirlo. No nos detendremos en cada uno de estos formatos, sólo los mencionaremos.

Formatos De Audio
Clave
Formatos De Video
Clave
Wave audio files
“audio/x-wav”
3GP video files
“video/3gp”
AU audio files
“audio/basic”
MPEG4 video files
“video/mp4”
MP3 audio files
“audio/mpeg”
-
-
MIDI audio files
“audio/midi”
-
-
Tone Sequences
“audio/x-tone-seq”
-
-

Existen otros formatos de audio y de video, pero, en J2ME, estos son los importantes.
Es importante saber qué tipo de formato soporta tu celular para que evites usar un formato inadecuado a la hora de hacer aplicaciones/juegos para tu celular. Descarga esta aplicación que te dirá qué formatos de audio y video soporta tu celular. Descargar App.

Si alguna vez tienes problemas con el formato de un archivo de audio y quieres cambiarle el formato, te recomiendo el siguiente programa. Descargar.

Si tienes problemas con el formato de un archivo de video, te recomiendo el siguiente programa para cambiarle el formato. Descargar.


Fuente Del Sonido
El  archivo de sonido que se reproducirá en la aplicación/juego puede obtenerse de una dirección web o de la misma aplicación/juego. En lo particular, no he utilizado la primera opción. En este tema sólo vamos a trabajar con la segunda opción, para lo cual debemos conocer la clase InputStream que nos va a permitir comunicar la aplicación/juego con el archivo de audio (o video) guardado en la misma. Se define de manera sencilla:

InputStream inStream = getClass().getResourceAsStream(“ubicación del archivo”);

Vemos que esta vez no utilizamos la palabra “new”, y esto es una particularidad de esta clase cuando la usamos para localizar archivos guardados en la propia aplicación/juego. El único parámetro que debemos proporcionar es la ubicación del archivo y esto es similar a como lo hicimos al ubicar una imagen (ver tema correspondiente). También debemos recordar que el archivo debe ser copiado a la carpeta “src” del proyecto que estamos creando, para que la aplicación/juego pueda ubicarlo.


Player
El Player es el que se va a encargar de reproducir los archivos de audio o video. Es necesario mencionar que el Player puede estar en 5 estados: UNREALIZED, REALIZED, PREFETCHED, STARTED y CLOSED. Cuando creamos un Player está en el estado UNREALIZED. Cuando lo pasamos al estado REALIZED el reproductor realiza la comunicación necesaria para localizar los elementos que necesita para funcionar (tal como un archivo). Cuando de detiene el reproductor el Player pasa de un estado STARTED a un estado PREFETCHED.


Player de Audio
A través de la clase Manager podemos reproducir sonidos, desde sonidos sencillos hasta archivos de sonidos, por lo tanto hay tres formas de crear un sonido:

Sonido
Notas
Manager.playTone(...);
Reproduce un solo sonido.
Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR)
Reproduce una secuencia de sonidos que determinemos.
Player p = Manager.createPlayer(InputStream iStream, String clave);
Reproduce un archivo de audio. Ya hablamos de InputStream. El parámetro clave depende del tipo de archivo (ver la primera tabla de este tema).

Nos concentraremos en la última de estas tres formas, que es la más importante.
Para crear un Player debemos definir primero el InputStream que utilizará y luego podemos definir el Player. Veamos un ejemplo:

InputStream inStream = getClass().getResourceAsStream(“/música.mp3”);

Player pl = Manager.createPlayer(inStream, “audio/mpeg”);
pl.start();

Luego que creemos el Player, para reproducirlo usamos el método .start();, como muestra el ejemplo.

Nota: al crear un Player ocurren dos errores que debemos atrapar, IOException y MediaException. Si queremos atrapar dos errores lo que debemos hacer es agregar otro catch para atrapar el segundo error, así:

InputStream inStream = getClass().getResourceAsStream(“/música.mp3”);

try{
    Player pl = Manager.createPlayer(inStream, “audio/mpeg”);
    pl.start();
}catch(IOException io){
}catch(MediaException me){}


Player de Video
Manager nos permite reproducir videos en nuestro celular, siempre y cuando lo soporte. Podemos definir este tipo de Player de la siguiente manera:

Player pl = Manager.createPlayer(InputStream iStream, String clave);

Pero esto no es todo lo que debemos hacer, sino que debemos tomar el control del video y colocarlo dentro de un elemento de tipo Form (no he probado colocarlo en un lienzo de dibujo...). Veamos un ejemplo completo:

try{
InputStream in = getClass.getResourceAsStream(“/mivideo.3gp”);
Player pl = Manager.createPlayer(in, “video/3gp”);

pl.realize();
GUIControl gc = (GUIControl)pl.getControl(“GUIControl”);
if(gc != null){
    Form form = new Form(“Mi Video”);
    form.append((Item)gc.initDisplayMode(GUIControl.USE_GUI_PRIMITIVE, null));
    display.setCurrent(form);
}

pl.start();

}catch(MediaException me){
}catch(IOException io){}

Un método importantes es .setDisplayFullscreen(boolean valor); que pertenece a VideoControl o GUIControl que permite expandir el tamaño del video hasta que llegue al tope del ancho o alto de la pantalla (true). Se hace de la siguiente forma:

GUIControl gc = (GUIControl)player.getControl(“GUIControl”);
gc.setDisplayFullscreen(true);

Descarga la aplicación de ejemplo de este tema. Descargar App.

Descarga el código y los recursos utilizados en la aplicación. Descargar.

No hay comentarios.:

Publicar un comentario