Atualizado: Tutorial/Dicas: Usando gStreamer, QT4 e Python para criar um player
Olá pessoas, depois de muito tempo sem passar por aqui para postar nada, decidi postar um pequeno tutorial, ou uma série de dicas para que vocês tenham uma ideia de como usar gStreamer, QT4 e Python na criação de um player
Primeiro, o porque do uso do QT4? Simples, não gosto muito do GTK, prefiro QT, sou lunatiKo, dá nisso
Depois, o porque do gStreamer? gStreamer é mais prático para quem quer criar um player, tá tudo ali, instala meia-duzia de pacotes e teu sistema toca tudo. Além do mais, dá suporte a efeitos e coisas afins. Numa aplicação QT4 pura, é melhor usar só o gStreamer e não o Phonon
Agora vamos deixar de lorota e começar a codar
O gStreamer tem toda uma estrutura de Pipelines, sinks e coisas do gênero, mas para um simples player nos não precisamos nos preocupar tanto assim
Basta um simples elemento, chamado playbin, o playbin faz o trabalho de criar o decoder, o sink para a saida de som e tudo mais, tudo automaticamente
Vejamos um pequeno código (Atenção, faça isso no interpretador python, afinal o gStreamer usa uma Thread para poder tocar tudo, portanto, o seu programa iria sair assim que chegasse no play
import gst
player = gst.Pipeline(’player’)
playbin = gst.element_factory_make(’playbin’)
player.add(playbin)
playbin.set_property(’uri’,'file:///home/…/minhamúsica.ogg’)
player.set_state(gst.STATE_PLAYING)
Viram que não é tão dificil não é
Agora analisemos o código:
import gst -> Importa o gStreamer
player = gst.Pipeline(’player’) -> Cria a pipeline
playbin = gst.element_factory_make(’playbin’) -> Cria o elemento playbin
player.add(playbin) -> Adiciona o playbin a pipeline do gStreamer
playbin.set_property(’uri’,'file:///home/…/minhamúsica.ogg’) -> Seta a propriedade uri do playbin para a localização do stream, isso pode ser um stream http, um arquivo local e por ai vai
player.set_state(gst.STATE_PLAYING) -> Muda o estado da pipeline, STATE_PLAYING começa a tocar, STATE_NULL para de tocar, STATE_PAUSED pausa o stream
Adivinhem só, se você colocar um stream de vídeo ai, ele vai mostrar o vídeo numa nova janela
Agora você se pergunta, como posso saber o fim do stream? Simples eu digo!
Usamos dbus e pygtk
Vejam só o código:
import gst, gtk
def mensagem(bus, message,player):
if message.type == gst.MESSAGE_EOS:
player.set_state(gst.STATE_NULL) # Vai para o stream na mensagem de fim-de-stream
player = gst.Pipeline(’player’)
bus = player.get_bus() # Pega o elemento do DBUS
bus.add_signal_watch() # Adiciona o watch de sinais
bus.enable_sync_message_emission() # Habilita a emissão de mensagens sync
bus.connect(’message’,message,player) #Conecta o sinal e passa como parametro opcional o player.
playbin = gst.element_factory_make(’playbin’)
player.add(playbin)
playbin.set_property(’uri’,'file:///home/…/minhamúsica.ogg’)
player.set_state(gst.STATE_PLAYING)
gtk.main() #Inicia o GTK para que o dbus funcione…
Isso dai já faz o player em si.
Depois desses códigos, vou deixar que vocês pesquisem um pouco
Vou dar logo uma dica, usem o QWidget.winId() (no Windows, int(QWidget.winId())), coloquem o gtk.main numa thread com QThread e criem um qt sinal para o “message” e o “sync-message::element”
Além disso, tenho um projeto de player aqui: http://svn.kinuxlinux.org/DJ, é chamado de DeeJay, as deps são gstreamer-python, pygtk, pyqt4
Aproveitem
Links:
- http://doc.trolltech.com
- http://pygstdocs.berlios.de
- http://pygtk.org


Julho 21st, 2008 at 13:52
Ohhhh, abandonou C++ ?
Muito legal a dica.
Julho 21st, 2008 at 18:23
Não não, só que também uso Python
é que tô numas apps mais rápidas pra serem feitas, ai uso Python mesmo, mas depois eu posto o C++ gStreamer style
Agosto 28th, 2008 at 21:08
Opa, como faço pra pegar a informacao de quantos segundos tem o arquivo de audio?
att
Agosto 29th, 2008 at 5:31
Jpunker, é só você monitorar o bus
mensagem(bus, message,player)
é só ver as mensagens, numa dessas mensagens chega uma das tags do arquivo, informações como duração e tudo mais, mas isso só funciona no Linux