Wednesday, November 11, 2009

Creando tus propios programas de multimedia en la tablet del n900

Ya tengo por fin mi nuevo telefono!!
Muchas gracias a mi querida universidad, la cual para una de las materias que estoy llevando consiguió una donación de nokia y nos regalaron a todos los alumnos un n900!
Las cosas sí que han sido ahora divertidas =)

Anyway,hoy hablaremos acerca de como utilizar gstreamer dentro del celular para poder hacer lindos programitas que puedan involucrar musica o incluso video! =)
Para empezar es importante entender lo que es Gstreamer y como es que nos ayuda a hacer applicaciones multimedia.
Gstreamer es un framework de multimedia que te ayuda a crear, editar y tocar multimedia al construir unos "pipelines" (como líneas de ensamblaje) que poseen elementos de multimedia. Simplemente se crea un pipeline, la cual posee muchos elementos que entre sí permiten que la musica se pueda tocar o que un video se pueda ver. Funciona de un modo muy similar a como son las líneas de ensamblaje en Linux/BSD/UNIX.

Con Gstreamer se atan a los elementos entre sí, y cada elemento lleva acabo algo en particular. Para demostrar esto, en una terminal escribe lo siguiente:
foo@bar:~$ gst-launch-0.10 filesrc location=jeans-ilusion_primer_amor.mp3 ! decodebin ! audioconvert ! alsasink


Cuando la línea anterior se corre, se escucha de pronto la grandiosa melodía de "...ni lo amigos saben que es lo que me paaasa,(...)con la ilusión del primer amor desesperado te amoooo..." ...ah good times ñ_ñ.
El comando gst-launch-0.10 se puede utilizar para correr pipelines de GStreamer y cada elemento esta ligado entre sí mediante el símbolo !. Puedes pensar que el ! es similar al pipe | que usas en la línea de comandos normalmente.
Ahora bien, como se pueden dar cuenta tenemos una serie de diversos elementos dentro de la línea de ensamblaje, estos son:
* filesrc – Este elemento permite cargar archivos que esten dentro del disco duro. Al ladito de este elemento se debe poner la dirección y el archivo que se quiere cargar
* decodebin – Necesitamos algo para poder descifrar al archivo que se acaba de cargar. Este elemento detecta el tipo de archivo con el cual deseamos trabajar y construye un elemento que lo decifrará.
* audioconvert – El tipo de información que posee u archivo de sonido y el tipo de información que necesitamos salga de las bocinas son diferentes, así que usamos a este elemento para hacer un buen mapeo entre lo que se tiene en el archivo de sonido y lo que se escuchará.
* alsasink – Este elemento escupe todo el audio a tu tarjeta de sonido usando ALSA.

Me parece que ya es claro que Gstreamer trabaja como un línea de ensamblaje, cada elemento le da como entrada al siguiente elemento su salida.
Ya que nos es claro que pex con Gstreamer, haremos ahora un pequeño código en C para probarlo.
Haremos un pequeño hola_mundo.c para Gstreamer. Desde la línea de comandos diremos que queremos que se toque y deberíamos posteriormente escuchar la cancioncita =)
El código, que usaremos es el siguiente:

#include gst/gst.h
#include stdbool.h

static GMainLoop *loop;

static gboolean bus_call (GstBus *bus,GstMessage *msg, gpointer user_data)
{
switch (GST_MESSAGE_TYPE (msg))
{
case GST_MESSAGE_EOS:
{
g_message ("End-of-stream");
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_ERROR:
{
gchar *debug;
GError *err;
gst_message_parse_error (msg, &err, &debug);
g_free (debug);
g_error ("%s", err->message);
g_error_free (err);
g_main_loop_quit (loop);
break;
}
default:
break;
}

return true;
}

void play_uri (gchar *uri)
{
GstElement *pipeline;
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_element_factory_make ("playbin", "player");
if (uri)
{

g_object_set (G_OBJECT (pipeline), "uri", uri, NULL);
}

{
GstBus *bus;

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, NULL);
gst_object_unref (bus);
}

gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);

g_main_loop_run (loop);

gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
}

int main (int argc,char *argv[])
{
gst_init (&argc, &argv);

play_uri (argv[1]);

return 0;
}



hmmm...creo que no tengo mucho tiempo de explicar el código...
Pero para compilarlo y probarlo, en la consola escriban:

gcc -Wall -g gstreame.c `pkg-config --cflags gtk+-2.0 gstreamer-0.10 gmodule-2.0` -o gstreame `pkg-config --libs gtk+-2.0 gstreamer-0.10` `pkg-config --libs gmodule-2.0`


Ahora bien, si lo quieren probar en su tablet de n900, lo que deben hacer es abrir su scratchbox, utilizar el target u objetivo de ARMEL, ( se pueden cambiar a ese objetivo escribiendo desde scratchbox: sb-conf se FREMANTLE_X86) y desde allí compilar el archivo, una vez que se tenga compilado, mediante scp pasaremos el binario a nuestro celular y ese binario será lo que correremos.
Para pasarlo a nuestra tableta de n900, es necesario primero saber el ip de nuestro celular, para hacerlo nos vamos al menu de applicaciones y hay un ícono que dice: More, ó Más, ó Mehr, dependiendo del idioma en que lo tengan configurado, dentro de ese ícono existe una ventanita negra, llamada X terminal, lo abrimos y tendremos la consola del celular! Allí simplemente escribimos ifconfig y apuntamos la dirección ip que se nos muestra.
Ahora,desde nuestra PC en scratchbox en el target de ARMEL escribimos:

scp gstreame user@192.168.0.12:


en donde gstreame es el binario que queremos pasar a nuestra tableta y 192.168.0.12 es la dirección IP de nuestro celular.
Para correrlo en la tableta n900, desde la consola X escribimos:

./gstreame "file://$PWD/test.wav"


En donde test.wav es el archivo que se escuchará. Es necesario escribirlo de esta forma debido a que el programa recibe una URL.
Y con esto, ya hemos ehcho un pequeño programa que toca musica desde nuestro n900!

Los dejo con un videito casero malo que hice,(non-ameteur porn) que muestra mi nuevo smart phone tocando una estación alemana, oh sí! el programa como recibe URI puede tocar estaciones de radio!! =)
Felices Hackeos!




Refrencias:
http://wiki.forum.nokia.com/index.php/GStreamer#
http://bluwiki.com/go/GStreamer/C_Hello_World
http://www.jonobacon.org/2006/08/28/getting-started-with-gstreamer-with-python/