ruby-****@sourc*****
ruby-****@sourc*****
2005年 3月 24日 (木) 22:03:55 JST
------------------------- REMOTE_ADDR = 213.37.10.235 REMOTE_HOST = REMOTE_USER = ruby-gnome2-hiki URL = http://ruby-gnome2.sourceforge.jp/cgi-bin/hiki/es/hiki.cgi?tut-gst-helloword ------------------------- TITLE = Hola mundo KEYWORD = = Hola mundo {{link("tut-gst-elements-state", nil, "tut-gst", "tut-gst-helloworld-conclusion")}} Para empezar crearemos una aplicai$B(B sencilla, un reproductor mp3 completo, usando componentes est$BaO(Bdar GStreamer. El reproductor leerde un archivo que serproporcionado como primer argumento al programa. == El c$B(Bigo require 'gst' Gst.init unless ARGV.length == 1 $stderr.puts "Usage: #{__FILE__} <mp3 filename>" exit 1 end # crea una nueva tuber$ByB(B para almacenar los elementos pipeline = Gst::Pipeline.new # crea un lector de disco filesrc = Gst::ElementFactory.make("filesrc") filesrc.location = ARGV.first # es el momento de crear el decodificador decoder = Gst::ElementFactory.make("mad") # una salida de audio audiosink = Gst::ElementFactory.make("osssink") # se a$B(Bden los objetos a la tuber$ByB(B principal pipeline.add(filesrc, decoder, audiosink) # se conectan los elementos filesrc >> decoder >> audiosink # comienza la reproducci$B(B pipeline.play while pipeline.iterate do end # se detiene la tuber$ByB(B pipeline.stop == Explicaci$B(B del c$B(Bigo Veamos el ejemplo paso a paso. Lo primero que hay que hacer es incluir la librer$ByB(B Ruby/GStreamer e inicializar en entorno. require 'gst' Gst.init ... Vamos a crear una tuber$ByB(B vacia. Como se ha visto en la introducci$B(B, esta tuber$ByB(B va a almacenar y gestionar todos los elementos que vamos a incluir en ella. ... # Crea una nueva tuber$ByB(B para almacenar los elementos pipeline = Gst::Pipeline.new ... Usaremos el constructor est$BaO(Bdar para una tuber$ByB(B: Gst::Pipeline.new. Ahora creamos el elemento de fuente de disco. Este elemento es capaz de leer desde un archivo. Usaremos el mecanismo de propiedades de GLib:Object para fijar una propiedad del elemento: el archivo desde el que se va a leer. ... # crea un lector de disco filesrc = Gst::ElementFactory.make("filesrc") filesrc.location = ARGV.first ... ((*Nota*)) Se puede comprobar si filesrc.nil? para verificar la creaci$B(B de el elemento de fuente de disco. A continuaci$B(B se crea el elemento decodificador de mp3. Asumimos que el plugin 'mad' estinstaladao en el sistema donde se ejecuta la aplicaci$B(B. ... # es el momento de crear el decodificador decoder = Gst::ElementFactory.make("mad") ... Gst::ElementFactory.make puede tomar dos argumentos: un string que identifica el elemento que necesitas y un segundo elemento: como quieres llamar al elemento. Puedes poner cualquier nombre de tu elecci$B(B y puede ser usado para identificar el elemento en un contenedor/tuber$ByB(B. Aquhemos escogido no indicar un nombre para el elemento, esto significa que GStreamer generarautom$BaU(Bicamente un nombre por nosotros. Finalmente crearemos nuestro elemento de salida de audio. Este elemento nos permitirreproducir el sonido usando OSS. ... # una salida de audio audiosink = Gst::ElementFactory.make("osssink") ... Se a$B(Bden los elementos a la tuber$ByB(B. ... # se a$B(Bden los objetos a la tuber$ByB(B principal pipeline.add(filesrc, decoder, audiosink) ... Los puertos de los diferentes elementos son conectados entre si: ... # se conectan los elementos filesrc >> decoder >> audiosink ... Ahora que hemos creado la tuber$ByB(B. Podemos visualizarla de esta forma: {{image_left("hello-world.png")}} {{br}} Todo estlisto para comenzar la reproducci$B(B. Usaremos las siguientes instrucciones para cambiar el estado de la tuber$ByB(B: ... # comienza la reproducci$B(B pipeline.play ... ((*Nota*)) GStreamer se ocuparde los estados READY y PAUSE al pasar de NULL a PLAYING. Ya que no usamos threads, a$B(B no ocurre nada. Tenemos que llamar a Gst::Bin#iterate para ejecutar un bucle de la tuber$ByB(B. ... while pipeline.iterate do end ... El m$BqU(Bodo Gst::Bin#iterate devolvertrue mientras haya algo interesante ocurriendo dentro de la tuber$ByB(B. Cuando se alcanza el fin del archivo el m$BqU(Bodo Gst::Bin#iterate devolverfalse y se terminarel bucle. ... # se detiene la tuber$ByB(B pipeline.stop ((*Nota*)) No hay que olvidar detener la tuber$ByB(B despu$BqT(B de usarla. Esto liberartodos los recursos ocupados por los elementos. == Ejecutando Hola mundo S$B(Bmplemente guarde el c$B(Bigo en un archivo llamado (({helloworld.rb})) y ejecute: ruby helloworld.rb miarchivo.mp3