[ruby-gnome2-doc-cvs] [Hiki] create - tut-gst-helloword

Back to archive index

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






ruby-gnome2-cvs メーリングリストの案内
Back to archive index