Gstreamer не производит звук при импорте из модуля homebrew - PullRequest
0 голосов
/ 20 декабря 2011

Ради интереса, я использовал python и gstreamer для создания простых аудиоплееров Linux.Первым был процедурный скрипт командной строки, который использовал gst-launch-0.10 playbin для воспроизведения веб-потока.Вторая версия была снова процедурной, но имела графический интерфейс и использовала playbin2 для создания конвейера gstreamer.Сейчас я пытаюсь создать полностью ООП-версию.

Первым делом я поместил код gstreamer в отдельный модуль и сохранил его как 'player.py':

#!/usr/bin/env python
# coding=utf-8

"""player.py"""

import glib, pygst
pygst.require("0.10")
import gst

class Player():
  def __init__(self):
    self.pipeline = gst.Pipeline("myPipeline")
    self.player = gst.element_factory_make("playbin2", "theplayer")
    self.pipeline.add(self.player)
    self.audiosink = gst.element_factory_make("autoaudiosink", 'audiosink')
    self.audiosink.set_property('async-handling', True)
    self.player.set_property("uri", "http://sc.grupodial.net:8086")
    self.pipeline.set_state(gst.STATE_PLAYING)

if __name__ == "__main__":
  Player()
  glib.MainLoop().run()

(Обратите внимание, что это очень простой экспериментальный скрипт, который автоматически загружает и воспроизводит поток. В конечном приложении будут специальные методы проигрывателя, позволяющие позаботиться о выборе URI / файла и воспроизведении / приостановке / остановке воспроизведения.)

Файл был помечен как исполняемый, и следующая команда обеспечила его нормальную работу при загрузке и воспроизведении веб-потока:

$ python player.py

Однако попытка запустить его напрямую (с использованием директивы shebang) вернулась

$ ./player.py
: No such file or directory

В любом случае, сделав его работающим как автономный скрипт, я написал следующий «основной» код приложения для импорта модуля проигрывателя и создания экземпляра проигрывателя:

#!/usr/bin/env python
# coding=utf-8

"""jukebox3.py"""

import glib
import player

def main():
  myplayer = player.Player()

  # remove these later:
  print myplayer.pipeline
  print myplayer.player
  print myplayer.audiosink
  print myplayer.player.get_property("uri")
  print myplayer.pipeline.get_state()

if __name__ == "__main__":
  main()
  glib.MainLoop().run()

Запускэтот основной сценарий либо через интерпретатор, либо напрямую не генерирует звука вообще , хотя я считаю, что экземпляр создан, потому что печатьtatements выводят информацию в соответствии с поведением playbin2:

/GstPipeline:myPipeline (gst.Pipeline)
/GstPipeline:myPipeline/GstPlayBin2:theplayer (__main__.GstPlayBin2)
/GstAutoAudioSink:audiosink (__main__.GstAutoAudioSink)
http://sc.grupodial.net:8086
(<enum GST_STATE_CHANGE_SUCCESS of type GstStateChangeReturn>, <enum GST_STATE_PLAYING of type GstState>, <enum GST_STATE_VOID_PENDING of type GstState>)

Кстати, результат тот же, используя glib.MainLoop или gtk.main для создания основного цикла.

Любые предложения, что яотсутствует?Или эта схема вообще возможна?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Я изменил имя основного скрипта, и все стало нормально.Я понятия не имею, почему, хотя.Надеюсь, что это в конечном итоге кому-нибудь пригодится.

0 голосов
/ 20 декабря 2011

Протестировал ваш пример приложения, и он отлично работает для меня, вам не нужен вызов glib mainloop в импортированном файле player.py, хотя

...