Я довольно новый (всего два дня) во всем мире потоковой передачи и захвата. Я пытаюсь захватить видеопоток с 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 вуаля! Это добилось цели.