Archive for the “GStreamer” Category

Uno de los problemas que más quebraderos de cabeza me ha dado desarrollando con GStreamer ha sido poder obtener la duración de la canción o del medio que estaba reproduciendo, ya que, sin obtener dicho valor, por ejemplo, no podría controlar la reproducción de la canción, es decir, saber por dónde va por ejemplo.

El problema radica en que, para poder obtener dicha información el pipeline DEBE estar en PAUSA, si no, será casi imposible leer dicho dato.

¿Cual era el problema que tenía?, pues que la función queryDuration me devolvía siempre CERO y como es lógico, con una duración de cero minutos y cero segundos poco puedo hacer.

Este era el código que usaba:

1
2
3
4
5
Gst.init();
 playbin = new PlayBin2("AudioPlayer");
 playbin.setInputFile(new File(path));
 playbin.setState(State.PAUSED);
 playbin.setVideoSink(ElementFactory.make("fakesink", "videosink"));

Y aun diciéndole que pusiera el estado del pipeline a PAUSED, seguía devolviendo un cero como valor.

Haciendo un debug a lo grande (poniendo un bucle sin reproducir nada y ver cual era la transicion de los estados y que valor devolvía xD), observé que el problema era que pasaba de cargar el archivo a reproducirlo de forma demasiado rápida, sin darle tiempo al programa a poner el estado a PAUSE y leer el valor de la duración, por lo que siempre al leer el estado, el valor que devolvía era cero.

¿Solución? esperar a que el pipeline se ponga en PAUSED antes de seguir con la reproducción.

 

1
2
3
while(playbin.getState()!=State.PAUSED){
System.out.println("El medio aun no está listo.");
}

Y así conseguimos detener la ejecución del programa hasta que el pipeline esté listo para leerse.

Comments No Comments »

Ultimamente he estado trabajando bastante con GStreamer y JAVA, ya que estoy sumergido en un proyecto bastante ilusionante la verdad del que, poco a poco, iré comentando aquí.

Lo que voy a comentar en este post es algo que podemos obtener de la propia web de GStreamer en su documentación, y no es otra cosa que reproducir un archivo MP3, o cualquier otro soportado por GStreamer, desde JAVA.

A continuación dejo los enlaces a la wikipedia de GStreamer y JAVA, para orientar a algún perdido.

  • Gstreamer – http://es.wikipedia.org/wiki/GStreamer
  • Java – http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java

En la propia documentación de GStreamer se nos avisa de la potencia de este framework y que no es apropiado para “iniciados”, por lo que recomienda usar otros como Java Media Framework, aunque si os soy sincero, con un poco de ganas es fácil de utilizar. Personalmente, he tenido más problemas a la hora de utilizar Swing, que conectando con GStreamer y utilizar sus herramientas.

Lo primero que hay que tener en cuenta es que tanto GStreamer como JAVA son multiplataforma, por lo que lo aquí enseñado debería, ojo, DEBERÍA, ser válido tanto para Windows, Linux (en estos dos SOs es donde he realizado las pruebas) y MAC.

Como he dicho, el siguiente código su única función es la de reproducir un archivo MP3, y tiene la siguiente estructura.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void runEngine(File file) {
try {
//Obtengo la ruta absoluta del archivo a reproducir
path = file.getAbsolutePath();
 
//Arrancamos la librería GSTREAMER para rpeorducir el medio.
Gst.init();
 
//Creamos la tubería por donde circulará la información, 
//playbin es el medio que proporciona GStreamer para 
//controlar la reproducción
playbin = new PlayBin("AudioPlayer");
 
//Agregamos el archivo que queremos reproducir
playbin.setInputFile(new File(path));
playbin.setVideoSink(ElementFactory.make("fakesink", "videosink"));
 
//Cambiamos el estado a PLAYING y comenzamos la reproducción.
playbin.setState(State.PLAYING);
} catch (Throwable e) {
System.out.println("GStreamer no soportado: " + e.getLocalizedMessage());
}
}

Como podemos observar, la herramienta principal es el objeto llamado “playbin”, lo cual es un pipeline ya creado que nos permite controlar la reproducción del medio.

Y hasta aquí lo más simple de todo, a partir del playbin, podemos controlar toda la reproducción (pausar, detener, resumir, avanzar…) y obtener información (bitrate, tiempo de reproducción…), por lo que es una herramienta muy poderosa.

En los foros de GStreamer se hablar de una evolución de playbin llamada playbin2, lo cual, por lo que he llegado a leer está en versión BETA, y no he llegado a probarlo.

Más adelante hablaré de como reproducir archivos de video y otras cosillas bastante interesantes que se pueden hacer con GStreamer, además, de liberar al fin mi proyecto en el cual llevo trabajando desde comienzos de este año y me ha servidor para sacar un sobresaliente en la carrera 😀

Comments 2 Comments »

   Beat diabetes   Diabetes diet