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.

Leave a Reply


   Beat diabetes   Diabetes diet