0

我正在尝试playbin用我自己的管道替换应用程序,因为我需要向视频添加过滤器。这是我尝试过的:

#     self.pipeline = gst.ElementFactory.make("playbin", None)
#     self.pipeline.set_property("uri", "appsrc://")
self.pipeline = gst.Pipeline.new("player")
source = gst.ElementFactory.make("uridecodebin", "decodebin")
source.set_property("uri", "appsrc://")
self.pipeline.add(source)

aqueue = gst.ElementFactory.make("queue", "aqueue")        
aconverter = gst.ElementFactory.make("audioconvert", "aconverter")        
asink = gst.ElementFactory.make("autoaudiosink", "audiosink")
self.pipeline.add(aqueue)
self.pipeline.add(aconverter)
self.pipeline.add(asink)
source.link(aqueue)
aqueue.link(aconverter)
aconverter.link(asink)

vqueue = gst.ElementFactory.make("queue", "vqueue")        
vconverter = gst.ElementFactory.make("videoconvert", "vconverter")
vsink = gst.ElementFactory.make("autovideosink", "videosink")
self.pipeline.add(vqueue)
self.pipeline.add(vconverter)
self.pipeline.add(vsink)
source.link(vqueue)
vqueue.link(vconverter)
vconverter.link(vsink)

后来我连接到源的source-setup信号,然后连接到need-data信号给它提供数据。这适用于playbin,即打开一个输出窗口并显示视频。使用我的自定义管道没有任何反应 - 没有打开任何窗口,当然我什么也看不到。

为什么会这样,我该如何解决?

我还尝试删除所有音频内容并仅使用视频元素,结果相同。我什至不需要这个应用程序的音频。

4

1 回答 1

1

Uridecodebin 具有动态填充。它们仅在流式传输开始时创建,因为它需要解复用/解码以了解它需要公开多少个焊盘。检查https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic

对于调试,查看 gstreamer 日志或检查管道总线是否有错误消息也是一种很好的做法。它可能会报告未链接的错误。或者检查链接调用的返回会告诉你它失败了。

无论如何,您可以使用 playbin 并设置video-filter属性。

于 2016-10-08T12:22:45.243 回答