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.

12
demandé sur Vini.g.fer 2016-04-12 19:53:46

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.

1
répondu sbond 2016-11-17 02:56:51

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.

0
répondu Atnas 2018-09-25 20:59:40