我正在尝试使用自己的管道替换应用程序中的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
,即打开输出窗口并显示视频。使用我的自定义管道没有任何反应 - 没有打开窗口,当然我看不到任何东西。
为什么会这样,我该如何解决?
我还尝试删除所有音频内容并仅使用视频元素,结果相同。我甚至不需要这个应用程序的音频。
答案 0 :(得分:1)
Uridecodebin有动态垫。它们仅在流式传输开始时创建,因为它需要解复用/解码才能知道需要暴露多少个焊盘。查看AppSettings from custom files
对于调试,最好查看gstreamer日志或检查管道总线是否有错误消息。它可能会报告一个未链接的错误。或者检查链接调用的返回值会告诉您它失败了。
无论如何,您只需使用playbin并设置video-filter
属性。