【问题标题】:python gstreamer memory leakpython gstreamer内存泄漏
【发布时间】:2015-02-15 00:37:40
【问题描述】:

我正在使用以下代码通过 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()

内存使用量每秒都在增加,并且永远不会减少;看起来,旧的source_bin 在创建新的时没有被释放。是 gstreamer/python-gstreamer 中的错误还是我遗漏了什么?

【问题讨论】:

  • 不是答案,但您考虑过使用 gstreamer-editing-services 吗?它可以让您非常轻松地创建幻灯片。如果您的图像名称遵循模式,您还可以使用“multifilesrc”
  • @Mathieu_Du 这是一个比幻灯片更复杂的系统,但只有在使用 jpegdec 时才会发生内存泄漏! imagefreeze,所以为了简单起见,我只展示了它,但谢谢。
  • 通过一次创建 jpegdec 和 imagefreeze 并重新使用它们来解决问题

标签: python memory-leaks gstreamer pygst


【解决方案1】:

在取消链接并将source_bin的状态设置为null后,您应该unref它以确保它被销毁。

注意:恕我直言,ref/unref 系统很适合在 C 中使用,您可以在其中精确计算引用,并且在像 python 这样的垃圾收集高级环境中不是那么方便。在你的情况下我会做的(我在类似的问题中做过)是建立一个解码箱池并重用它们。

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 2017-01-15
    • 2012-02-17
    • 1970-01-01
    • 2012-05-14
    • 2012-12-02
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    相关资源
    最近更新 更多