我使用以下代码通过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
在创建新的{{1}}时没有被释放。它是gstreamer / python-gstreamer中的一个错误还是我错过了什么?
答案 0 :(得分:0)
取消链接并将source_bin的状态设置为null后,您应该unref确保它被销毁。
一个注意事项:恕我直言,ref / unref系统很适合在C中使用,你可以精确地计算引用,它在垃圾收集的高级环境如python中并不那么方便。在你的情况下我会做的(我在类似的问题中做过)是建立一个解码箱池并重用它们。