gstreamer:自定义管道没有输出(替换 playbin)
gstreamer: no output from custom pipeline (replacing playbin)
我正在尝试用我自己的管道替换应用程序中的 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
,即输出 window 打开并显示视频。使用我的自定义管道没有任何反应 - 没有 window 打开,当然我什么也看不到。
为什么会这样,我该如何解决?
我也尝试过删除所有音频内容并仅使用视频元素,结果相同。我什至不需要此应用程序的音频。
Uridecodebin 有动态键盘。它们仅在流式传输开始时创建,因为它需要 demux/decode 才能知道它需要暴露多少个焊盘。检查 https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic
对于调试,查看 gstreamer 日志或检查管道总线是否有错误消息也是一种很好的做法。它可能会报告一个 not-linked 错误。或者检查 return 中的 link 调用会告诉您它失败了。
无论如何,你可以只使用 playbin 并设置 video-filter
属性。
我正在尝试用我自己的管道替换应用程序中的 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
,即输出 window 打开并显示视频。使用我的自定义管道没有任何反应 - 没有 window 打开,当然我什么也看不到。
为什么会这样,我该如何解决?
我也尝试过删除所有音频内容并仅使用视频元素,结果相同。我什至不需要此应用程序的音频。
Uridecodebin 有动态键盘。它们仅在流式传输开始时创建,因为它需要 demux/decode 才能知道它需要暴露多少个焊盘。检查 https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic
对于调试,查看 gstreamer 日志或检查管道总线是否有错误消息也是一种很好的做法。它可能会报告一个 not-linked 错误。或者检查 return 中的 link 调用会告诉您它失败了。
无论如何,你可以只使用 playbin 并设置 video-filter
属性。