Отправка вывода OpenCV в поток VLC
Это помогло мне заняться хорошей частью дня, и мне не удалось заставить его работать, но я чувствую, что я действительно рядом.
У меня установлен openCV, который берет видеофайлы с веб-камеры. Чтобы иметь доступ к этому видеопотоку (с наложением OpenCV), я хочу передать вывод openCV python script в поток VLC. Мне удалось запустить поток и подключиться к нему. VLC изменяет размер до правильного соотношения сторон и разрешения, поэтому он получает некоторые правильные данные, но изображение, которое я получаю, просто Jitter;
python opencv.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240 --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}" &
Выходной сигнал script - это постоянный видеопоток, отправленный на стандартный вывод
from imutils.video import WebcamVideoStream
vs = WebcamVideoStream(src=0)
while True:
frame = vs.read()
sys.stdout.write(frame.tostring())
Вышеприведенная версия script, которую я использую; Также, как я вижу, я использую библиотеку imutils; https://github.com/jrosebr1/imutils
Если бы кто-нибудь мог подтолкнуть меня в правильном направлении, я был бы очень признателен. Я предполагаю, что stdout.write(frame.tostring()) - это не то, что ожидает vlc, но я не смог понять это сам.
Ответы
Ответ 1
Это сработало для меня, хотя я отправляю поток RTSP и не использую библиотеку imutils:
import numpy as np
import sys
import cv2
input_rtsp = "rtsp://10.10.10.9:8080"
cap = cv2.VideoCapture(input_rtsp)
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
sys.stdout.write(frame.tostring())
else:
break
cap.release()
Затем в командной строке:
python opencv.py | cvlc --demux=rawvideo --rawvid-fps=25 --rawvid-width=1280 --rawvid-height=720 --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=25,width=1280,height=720}:rtp{dst=10.10.10.10,port=8081,sdp=rtsp://10.10.10.10:8081/test.sdp}"
Обратите внимание, что вам не нужно преобразовывать opencv BGR в RGB.