Я пытаюсь построить конвейер с 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 и сохраняют их навсегда) - тоже не помогает.
Нужно ли где-нибудь освобождать память? Я нашел вызовы gst_object_unref
в коде C, но я не уверен, стоит ли использовать unref в коде Python.
Также простой конвейер '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