Gstreamer, Docker, udpsrc, OpenCV, Python ... Не работает - PullRequest
0 голосов
/ 28 июня 2018

Я довольно новый (всего два дня) во всем мире потоковой передачи и захвата. Я пытаюсь захватить видеопоток с UDP-порта, используя OpenCV и Python. Я хочу, чтобы мой скрипт запускался внутри контейнера Docker. Я создал докер-контейнер на основе Fedora и установил в него Python3.6.5, OpenCV. OpenCV был скомпилирован из исходного кода со следующими параметрами -

cmake -DBUILD_TIFF=ON \
    -DBUILD_WEBP=ON \
    -DBUILD_opencv_java=OFF \
    -DWITH_CUDA=OFF \
    -DENABLE_AVX=ON \
    -DWITH_OPENGL=ON \
    -DWITH_OPENCL=ON \
    -DWITH_IPP=ON \
    -DWITH_TBB=ON \
    -DWITH_GSTREAMER=ON \
    -DWITH_EIGEN=ON \
    -DWITH_V4L=ON \
    -DBUILD_TESTS=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") \
    -DPYTHON_EXECUTABLE=$(which python) \
    -DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
    -DPYTHON_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
    -DWITH_FFMPEG=ON \
    -DWITH_GTK_2_X=ON \
    -DBUILD_PNG=ON \
    -DBUILD_JASPER=ON \
    -DBUILD_JPEG=ON \
    -DWITH_V4L=ON .. \

Я проверил порт UDP с помощью следующей команды -

tcpdump -i lo -n udp port <port_number>

Кажется, что он получает пакеты правильно. В этом нет проблем.

В моем контейнере есть следующий скрипт для чтения фреймов из udpsrc

import cv2

gst_string = "udpsrc port=<port_number> caps=\"application/x-rtp, media=(string)video, clock-rate=(int)90000\" ! rtpvp8depay ! vp8dec ! videoconvert ! appsink"

video_capture = cv2.VideoCapture(gst_string)

while video_capture.isOpened():
    ret, frame = video_capture.read()
    print("Frame received {}".format(ret))

И я запускаю свой док-контейнер с помощью следующей команды -

docker run -it -p <port_number>:<port_number>/udp myworker /bin/bash

И, наконец, когда из командной строки bash я запускаю скрипт, используя python worker.py, он не входит в цикл, поскольку video_capture.isOpened() возвращает False.

У меня очень мало опыта по всем этим вопросам (кроме Python и в некоторой степени Docker), поэтому я не могу понять, что я делаю неправильно. Пожалуйста, помогите мне.

Заранее спасибо

РЕДАКТИРОВАТЬ ----------------

Для получения дополнительной информации я установил следующие подключения к gstreamer -

yum install -y libnice-gstreamer1 \
    gstreamer-plugins-good \
    gstreamer1-plugins-ugly \
    gstreamer1-plugins-good \
    gstreamer-plugins-bad-free-extras \
    gstreamer-plugins-espeak gstreamer \
    gstreamer1 \
    gstreamer1-plugins-base-tools \
    gstreamer1-plugins-bad-free-extras \
    gstreamer1-plugins-bad-freeworld \
    gstreamer-plugins-bad-free \
    gstreamer1-plugins-base \
    gstreamer1-plugins-good-extras \
    gstreamer-plugins-base gstreamer-tools \
    PackageKit-gstreamer-plugin \
    gstreamer1-plugins-bad-free

РЕДАКТИРОВАТЬ -2 ---------------------------------

Как уже упоминалось в комментариях, в OpenCV, который я использовал, не было скомпилированного Gstreamer. Таким образом, я не смог открыть Видеозахват. Таким образом, команда yum сверху в итоге становится -

RUN yum install -y libnice-gstreamer1 \
    gstreamer1-plugins-ugly \
    gstreamer1-plugins-good \
    gstreamer1 \
    gstreamer1-plugins-base-devel \
    gstreamer-plugins-base-tools \
    gstreamer1-plugins-bad-free-extras \
    gstreamer1-plugins-bad-freeworld \
    gstreamer1-plugins-base \
    gstreamer1-plugins-good-extras \
    gstreamer1-plugins-base \
    gstreamer1-plugins-bad-free \
    gstreamer-plugins-base-devel

Et вуаля! Это добилось цели.

...