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

Back to archive index

ruby-gnome2-hiki-pt_BR****@sourc***** ruby-gnome2-hiki-pt_BR****@sourc*****
2004年 4月 11日 (日) 07:45:31 JST


-------------------------
REMOTE_ADDR = 200.216.145.78
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/pt_BR/?tut-gst-helloworld
-------------------------
= Ruby/GStreamer: OlMundo
{{link("tut-gst-elements-state", nil, "tut-gst", "tut-gst-helloworld-conclusion")}}

Criaremos uma primeira aplica艫o simples, um tocador completo de MP3, usando os componentes de GStreamer padrs. O tocador lerde um arquivo que seja fornecido como o primeiro argumento para o programa.

== O Cigo

  require 'gst'

  Gst.init
  unless ARGV.length == 1
    $stderr.puts "Uso: #{__FILE__} <arquivo mp3>"
    exit 1
  end

  # cria um novo "pipeline" para guardar os elementos
  pipeline = Gst::Pipeline.new

  # cria um leitor de disco
  filesrc = Gst::ElementFactory.make("filesrc")
  filesrc.location = ARGV.first

  # agora hora de pegar o decodificador
  decoder = Gst::ElementFactory.make("mad")

  # e um "sink" de 疼dio
  audiosink = Gst::ElementFactory.make("osssink")

  # adiciona objetos ao "pipeline" principal
  pipeline.add(filesrc, decoder, audiosink)

  # conecta os elementos
  filesrc >> decoder >> audiosink

  # inicia a tocar
  pipeline.play

  while pipeline.iterate do end

  # para o "pipeline"
  pipeline.stop

== O Cigo Explicado

Vamos atrav駸 deste exemplo passo a passo.

A primeira coisa que voctem que fazer carregar a biblioteca Ruby/GStreamer e inicializar o framework.

  require 'gst'
  Gst.init
  ...

Iremos criar um "pipeline" vazio. Como vocviu na introdu鈬o b疽ica, esse "pipeline" guardare gerenciartodos os elementos que n iremos carregar nele.

  ...
  # cria um novo "pipeline" para guardar os elementos
  pipeline = Gst::Pipeline.new
  ...

A gente usa o construtor padr縊 para um "pipeline": Gst::Pipeline.new.

A gente ent縊 cria um elemento de origem de disco. O elemento de origem de disco capaz de ler de um arquivo. A gente usa o mecanismo padr縊 de propriedade de GLib::Object para configurar uma propriedade do elemento: o arquivo de onde serlido. 

  ...
  # cria um leitor de disco
  filesrc = Gst::ElementFactory.make("filesrc")
  filesrc.location = ARGV.first
  ...
  
((*Nota*)) Vocpode verificar se filesrc.nil? para verificar a cria鈬o do elemento de origem de disco.

Agora a gente cria o elemento decodificador de MP3. Isso assume que o plugin 'mad' estinstalado no sistema onde a aplica鈬o for executada.

  ...
  # agora hora de pegar o decodificador
  decoder = Gst::ElementFactory.make("mad")
  ...

O Gst::ElementFactory.make pode levar dois argumentos: uma string que iridentificar o elemento que vocprecisa e um segundo argumento: como vocquer nomear o elemento. O nome do elemento aldo que vocpode escolher e pode ser usado para recuperar o elemento de um "bin/pipeline". Aqui a gente escolheu n縊 fornecer um nome para o elemento, isso significa que o GStreamer irgerar automaticamente um nome para a gente.

Finalmente a gente cria o nosso elemento "sink" de 疼dio. Esse elemento sercapaz de tocar o 疼dio usando OSS.

  ...
  # e um "sink" de 疼dio
  audiosink = Gst::ElementFactory.make("osssink")
  ...

A gente ent縊 adiciona os elementos ao "pipeline".

  ...
  # adiciona objetos ao "pipeline" principal
  pipeline.add(filesrc, decoder, audiosink)
  ...

A gente conecta os diferentes "pads" dos elementos, assim:

  ...
  # conecta os elementos
  filesrc >> decoder >> audiosink
  ...

Agora a gente criou um "pipeline" completo. A gente pode visualizar o "pipeline" como a seguir:

{{image_left("en:hello-world.png")}}
{{br}}

Tudo estconfigurado para come軋r a tocar. A gente usa os cigos a seguir para alterar o estado do "pipeline":

  ...
  # inicia a tocar
  pipeline.play
  ...

((*Nota*)) O GStreamer cuidardos estados "READY" e "PAUSED" para vocao sair de "NULL" para "PLAYING". 

Como a gente n縊 usa threads, nada vai acontecer ainda. A gente tem que chamar Gst::Bin#iterate para executar uma itera鈬o do "pipeline".

  ...
  while pipeline.iterate do end
  ...

O m騁odo Gst::Bin#iterate retornar"true" a menos que algo interessante tenha ocorrido dentro do "pipeline". Quando o final do arquivo foi alcan軋do, o m騁odo Gst::Bin#iterate retornar"false" e aa gente pode finalizar o loop.

  ...
  # para o "pipeline"
  pipeline.stop

((*Nota*)) N縊 esque軋 de para o "pipeline" ap o uso. Isso liberartodos os recursos seguros pelos elementos.

== Executando o OlMundo

Apenas salve o cigo em um arquivo chamado (({helloworld.rb})) e fa軋:

  ruby helloworld.rb foo.mp3





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