gpt4 book ai didi

python - python的gst.LinkError问题的Gstreamer

转载 作者:太空狗 更新时间:2023-10-29 18:19:42 26 4
gpt4 key购买 nike

我正在用 Python 连接一个 gstreamer 应用程序。我得到一个带有以下代码的 LinkError:

import pygst
pygst.require('0.10')
import gst

import pygtk
pygtk.require('2.0')
import gtk

# this is very important, without this, callbacks from gstreamer thread
# will messed our program up
gtk.gdk.threads_init()

def main():
pipeline = gst.Pipeline('pipleline')

filesrc = gst.element_factory_make("filesrc", "filesrc")
filesrc.set_property('location', 'C:/a.mp3')

decode = gst.element_factory_make("decodebin", "decode")

convert = gst.element_factory_make('audioconvert', 'convert')

sink = gst.element_factory_make("autoaudiosink", "sink")

pipeline.add(filesrc, decode, convert, sink)
gst.element_link_many(filesrc, decode, convert, sink)

pipeline.set_state(gst.STATE_PLAYING)

gtk.main()

main()

错误:

ImportError: could not import gio
Traceback (most recent call last):
File "H:\workspace\ggg\src\test2.py", line 37, in <module>
main()
File "H:\workspace\ggg\src\test2.py", line 31, in main
gst.element_link_many(filesrc, decode, convert, sink)
gst.LinkError: failed to link decode with convert

这很奇怪,使用相同的管道,但使用 parse_launch 构建,它可以工作。这是代码:

import pygst
pygst.require('0.10')
import gst

import pygtk
pygtk.require('2.0')
import gtk

# this is very important, without this, callbacks from gstreamer thread
# will messed our program up
gtk.gdk.threads_init()

def main():
player = gst.parse_launch('filesrc location=C:/a.mp3 ! decodebin ! audioconvert ! autoaudiosink')
player.set_state(gst.STATE_PLAYING)
gtk.main()

main()

问题来了,为什么手动的失败了,解析的却成功了?这有什么问题吗?我该如何解决?

谢谢。

最佳答案

你的问题在这里:

gst.element_link_many(filesrc, decode, convert, sink)

原因是并非所有元素都具有简单的静态输入和输出。此时在您的程序中,您的 decodebin 没有任何源垫(即:没有输出)。

垫就像一个奶嘴 - 它是一个元素的输入/输出。垫可以出现、消失或只是坐在那里。垫子分为三类:静态垫子(最简单的也是您所期望的)、请求垫子(仅在您要求时出现)和有时pads(只有当元素想要让它们出现时才会出现)。 decodebin 的输出有时是 pads

如果您检查 gst-inspect decodebin 的输出,您可以自己看到:

Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
ANY

SRC template: 'src%d'
Availability: Sometimes
Capabilities:
ANY

在程序的第 26 行,您无法将 decode 链接到任何内容,因为它没有任何可链接的源板。 decodebin 上的 source pad 仅在输入流被解码时出现:这不会立即发生。可能会出现任意数量的源垫(例如,一个用于音频流,两个用于带音频的视频流,没有一个用于不可解码的流)。

您需要等到焊盘创建完毕,然后链接它们。 decodebin 发出信号“new-decoded-pad”来告诉您何时发生这种情况(这也记录在 gst-inspect decodebin 中)。您必须将回调函数连接到此信号,并在回调中链接解码和音频转换。这是您更正后的代码:

#!/usr/bin/python

import pygst
pygst.require('0.10')
import gst

import pygtk
pygtk.require('2.0')
import gtk

# this is very important, without this, callbacks from gstreamer thread
# will messed our program up
gtk.gdk.threads_init()

def on_new_decoded_pad(dbin, pad, islast):
decode = pad.get_parent()
pipeline = decode.get_parent()
convert = pipeline.get_by_name('convert')
decode.link(convert)
pipeline.set_state(gst.STATE_PLAYING)
print "linked!"

def main():
pipeline = gst.Pipeline('pipleline')

filesrc = gst.element_factory_make("filesrc", "filesrc")
filesrc.set_property('location', 'C:/a.mp3')

decode = gst.element_factory_make("decodebin", "decode")

convert = gst.element_factory_make('audioconvert', 'convert')

sink = gst.element_factory_make("autoaudiosink", "sink")

pipeline.add(filesrc, decode, convert, sink)
gst.element_link_many(filesrc, decode)
gst.element_link_many(convert, sink)

decode.connect("new-decoded-pad", on_new_decoded_pad)

pipeline.set_state(gst.STATE_PAUSED)

gtk.main()

main()

gst.parse_launch 之所以有效,是因为它会为您处理所有这些琐碎的细节。还有高级元素 playbin,它会在内部自动创建和链接 decodebin。

关于python - python的gst.LinkError问题的Gstreamer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2993777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com