首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python gstreamer内存泄漏

python gstreamer内存泄漏
EN

Stack Overflow用户
提问于 2014-12-17 00:15:07
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
# 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时,旧的one并没有被释放。这是gstreamer/python-gstreamer中的一个bug,还是我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-08-16 23:59:56

在解除链接并将source_bin的状态设置为null后,您应该对其执行unref操作以确保销毁。

注意: IMHO的ref/unref系统在C中很好用,你可以精确地计算引用,但在像python这样的垃圾回收的高级环境中就不那么方便了。我在你的例子中所做的(我在一个类似的问题中也做过)是构建一个解码箱池并重用它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27509069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档