Envoi de la sortie OpenCV à VLC stream
cela m'occupe depuis une bonne partie de l'après-midi et je n'ai pas réussi à le faire marcher mais j'ai l'impression d'être vraiment proche.
j'ai mis en place openCV qui prend la vidéo d'une webcam. Pour pouvoir accéder à ce flux vidéo (avec la superposition openCV), je veux transférer la sortie du script python openCV dans un flux VLC. J'ai réussi à faire démarrer le flux et je peux me connecter à celui-ci. VLC se redimensionne au bon rapport d'aspect et à la bonne résolution de sorte qu'il obtient un certain données correctes mais l'image que je reçois est juste Gigue;
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}" &
la sortie du script est un flux vidéo constant envoyé à stdout comme suit
from imutils.video import WebcamVideoStream
vs = WebcamVideoStream(src=0)
while True:
frame = vs.read()
sys.stdout.write(frame.tostring())
L'exemple ci-dessus est une version édulcorée du script que j'utilise; aussi vu que j'utilise la bibliothèque imutils; https://github.com/jrosebr1/imutils
Si quelqu'un pouvait me donner un coup de pouce dans la bonne direction, j'apprécierais grandement. Ma conjecture est que les la sortie standard stdout.écrire(l'image.tostring()) n'est pas ce que vlc attend, mais je n'ai pas pu le comprendre moi-même.
2 réponses
cela a fonctionné pour moi, bien que j'envoie à RTSP stream et n'utilisant pas la bibliothèque 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()
Puis en ligne de commande:
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}"
notez que vous n'avez pas besoin de convertir opencv BGR en RGB.
les travaux suivants pour moi sous Python 3
import numpy as np
import sys
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
sys.stdout.buffer.write(frame.tobytes())
else:
break
cap.release()
Et la ligne de commande (ma webcam a une résolution différente, et je ne afficher le résultat, mais vous n'avez pas de problèmes avec ça)
python opencv.py | vlc --demux=rawvideo --rawvid-fps=25 --rawvid-width=640 --rawvid-height=480 --rawvid-chroma=RV24 - --sout "#display"
bien sûr, cela nécessite une conversion de BGR en RGB car la première est par défaut dans OpenCV.