2016-04-12 15 views
11

Questo mi ha tenuto impegnato per buona parte del pomeriggio e non sono riuscito a farlo funzionare ma mi sento davvero vicino.Invio dell'output OpenCV al flusso VLC

Ho installato openCV che prende il video da una webcam. Per poter accedere a questo feed video (con overCV aperto) voglio canalizzare l'output dello script python openCV su uno stream VLC. Sono riuscito a far funzionare lo stream e a poterci connettere. VLC ridimensiona al rapporto di aspetto e alla risoluzione corretti in modo da ottenere alcuni dati corretti ma l'immagine che ottengo è solo 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}" & 

L'output dello script è un feed video costante inviato a stdout come segue

from imutils.video import WebcamVideoStream 

vs = WebcamVideoStream(src=0) 

while True: 
    frame = vs.read() 
    sys.stdout.write(frame.tostring()) 

Sopra esempio è una versione dumbed giù dello script che sto utilizzando; Inoltre, come visto, sto facendo uso della libreria imutils; https://github.com/jrosebr1/imutils

Se qualcuno potesse darmi una spinta nella giusta direzione lo apprezzerei molto. La mia ipotesi è la stdout.write (frame.tostring()) non è ciò che si aspetta vlc ma non sono stato in grado di capirlo da solo.

+0

cosa vuoi dire l'immagine è solo jitter? – incBrain

+0

Fondamentalmente un'immagine veramente distorta che si sposta verso l'alto in diagonale. Non proprio collegato al feed video reale dalla webcam, per quanto ho potuto capire. (Non è cambiato quando ho spostato gli oggetti davanti alla webcam) Quindi suppongo che VLC non possa intercettare i dati frame.tostring(). –

+0

è probabilmente una mancata corrispondenza nel formato video. Sei sicuro che RV24 sia il formato di output corretto? Assicurarsi inoltre che le dimensioni corrispondano a – incBrain

risposta

1

questo ha lavorato per me, anche se io mando a RTSP flusso e che non utilizzano imutils libreria:

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() 

Poi, in linea di comando:

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}" 

Si noti che non è necessario convertire OpenCV BGR a RGB.