Gstreamer 从自制模块导入时未产生音频
为了好玩,我一直在用 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()
(请注意,这只是一个非常简单的实验性脚本,它会自动加载并播放一个流。在最终的应用中,会有特定的 Player 方法来处理 URI/文件选择以及播放/暂停/停止的功能。)
这个文件被标记为可执行,使用以下命令可以正常运行,网络流被加载并播放:
$ python player.py
但是,直接运行它(使用 shebang 指令)却返回了
$ ./player.py
: No such file or directory
无论如何,在让它作为独立脚本工作后,我写了以下“主”应用代码来导入播放器模块并创建 Player 的实例:
#!/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()
通过解释器或直接运行这个主脚本时,完全没有声音,不过我相信实例是创建成功的,因为打印语句输出的信息与 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
我测试了你的示例应用程序,运行得很好。不过,在导入的player.py文件中,你不需要调用glib的主循环。
0
我把主脚本的名字改了一下,结果一切都正常运行了。不过我也不知道为什么会这样。希望这对以后有需要的人有帮助。