gpt4 book ai didi

python - gsteramer appsink 内存泄漏(python 绑定(bind))

转载 作者:行者123 更新时间:2023-12-01 01:47:10 24 4
gpt4 key购买 nike

我正在尝试使用 appsink 构建管道,但它占用了大量内存:

#!/usr/bin/env python

import sys

import gi


gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst


def main():
GObject.threads_init()
Gst.init(None)
# pipeline = Gst.parse_launch('fakesrc ! fakesink')
pipeline = Gst.parse_launch('fakesrc ! appsink')

loop = GObject.MainLoop()

pipeline.set_state(Gst.State.PLAYING)
try:
loop.run()
except:
pass

pipeline.set_state(Gst.State.NULL)


if __name__ == '__main__':
sys.exit(main())

即使没有设置连接,内存也会不断增加。我尝试使用sink.connect(“new-sample”,handler,sink)连接一个函数 - 它也会泄漏内存。还尝试将处理程序添加到总线(在某处读到 gst 可能会将未传递到 python 的消息排入队列并永远保留它们) - 也没有帮助。

我需要在某处释放内存吗?我在 C 代码中发现了对 gst_object_unref 的调用,但我不确定是否应该在 python 代码中使用 unref。

此外,简单的管道'fakesrc! fakesink' 不会泄漏内存。

脚本在 Docker 内部运行(不确定这是否重要,遗憾的是我无法在 Docker 外部进行测试):

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir -p /code
WORKDIR /code
ADD Pipfile Pipfile.lock /code/
RUN apt-get update && apt-get install -y software-properties-common cmake \
gobject-introspection libgirepository1.0-dev libcairo2-dev \
libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools \
python-gst-1.0
RUN pip install pipenv && pipenv install --system
ADD . /code/
WORKDIR /code/src
EXPOSE 8181
CMD python main.py

最佳答案

Appsink 有一个队列,用于存储传入的样本。默认情况下,此大小是无限的。您可以通过 appsink 的 max-buffersdrop 属性来控制它,这样它就不会无限增长。

但您实际上需要做的是主动将这些样本从 appsink 中拉出并进行处理 - 或者至少丢弃它们。

new-sample 信号是一个好的开始。如果该信号被触发,则新样本已到达并准备好进行处理。我在这里具体记不起 Python,但您想调用 appsink 对象的 pull_sample 方法,以将示例的所有权从 appsink 转移给您自己。一旦超出范围,该示例应该会正确发布 - 我猜。

编辑:确保信号已发出。有一个 appsink 属性 emit-signals 默认情况下处于关闭状态。但我通常做 C 的东西,所以我不确定 Python 是否会翻转一些开关,以便它开箱即用。

关于python - gsteramer appsink 内存泄漏(python 绑定(bind)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com