python gstreamer内存泄漏

python gstreamer内存泄漏,python,memory-leaks,gstreamer,pygst,Python,Memory Leaks,Gstreamer,Pygst,为了简单起见,我使用以下代码通过gstreamer显示幻灯片,以下代码每秒只重新显示相同的图像: # python testcase.py large-image.jpg import gi gi.require_version("Gst", "1.0") from gi.repository import GLib, GObject, Gst import sys class Player(object): def __init__(self): Gst.ini

为了简单起见,我使用以下代码通过gstreamer显示幻灯片,以下代码每秒只重新显示相同的图像:

# python testcase.py large-image.jpg

import gi
gi.require_version("Gst", "1.0")

from gi.repository import GLib, GObject, Gst
import sys


class Player(object):
    def __init__(self):
        Gst.init(None)

        self.pipeline = Gst.Pipeline()

        self.source_bin = None

        self.sink = Gst.ElementFactory.make("xvimagesink")
        self.pipeline.add(self.sink)

    def play(self):
        self._load_next_file()

    def _load_next_file(self):
        self.pipeline.set_state(Gst.State.READY)

        if self.source_bin is not None:
            self.pipeline.remove(self.source_bin)
            self.source_bin.set_state(Gst.State.NULL)

        self.source_bin = self._create_image_source_bin()
        self.pipeline.add(self.source_bin)
        self.source_bin.link(self.sink)
        self.source_bin.sync_state_with_parent()
        self.pipeline.set_state(Gst.State.PLAYING)

    def _create_image_source_bin(self):
        src = Gst.ElementFactory.make("filesrc")
        src.set_property("location", sys.argv[1])

        decoder = Gst.ElementFactory.make("jpegdec")

        freezer = Gst.ElementFactory.make("imagefreeze")

        GObject.timeout_add(1000, self._on_image_timeout)

        bin = Gst.Bin()
        bin.add(src)
        bin.add(decoder)
        bin.add(freezer)
        bin.add_pad(Gst.GhostPad.new("src", freezer.get_static_pad("src")))
        src.link(decoder)
        decoder.link(freezer)
        return bin

    def _on_image_timeout(self):
        self._load_next_file()
        return False

p = Player()
p.play()

GObject.MainLoop().run()

内存使用率每秒钟增加一次,从不减少;看起来,在创建新的源代码时,旧的源代码_bin没有被释放。这是gstreamer/python gstreamer中的错误还是我遗漏了什么?

在取消链接并将源代码的state设置为null后,您应该删除它以确保已销毁


注意:在C语言中使用ref/unref系统很好,在C语言中可以精确地计算引用,而在像python这样的垃圾收集高级环境中,它就不那么方便了。对于您和我在类似问题中所做的,我会做的是建立一个解码箱池并重用它们。

不是答案,但您是否考虑过使用gstreamer编辑服务?它可以让你很容易地创建幻灯片。如果图像的名称符合模式,您也可以使用multifilesrc@Mathieu_Du这是一个比幻灯片更复杂的系统,但只有在使用jpegdec时才会发生内存泄漏!imagefreeze所以我只是为了简单起见才介绍它,但谢谢。通过创建jpegdec和imagefreeze一次并重新使用,解决了这个问题