Gstreamer 从自制模块导入时未产生音频

0 投票
2 回答
730 浏览
提问于 2025-04-17 08:42

为了好玩,我一直在用 pythongstreamer 创建简单的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.MainLoopgtk.main 来创建主循环,结果是一样的。

有没有什么建议我可能遗漏了什么?或者,这个方案根本可行吗?

2 个回答

0

我测试了你的示例应用程序,运行得很好。不过,在导入的player.py文件中,你不需要调用glib的主循环。

0

我把主脚本的名字改了一下,结果一切都正常运行了。不过我也不知道为什么会这样。希望这对以后有需要的人有帮助。

撰写回答