Ради интереса, я использовал 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
для создания основного цикла.
Любые предложения, что яотсутствует?Или эта схема вообще возможна?