2016-04-12 27 views
11

To zajęło mi dużo czasu po południu i nie mogłem go uruchomić, ale czuję, że jestem bardzo blisko.Wysyłanie wyjścia OpenCV do strumienia VLC

Mam zestaw openCV, który pobiera videofeed z kamery internetowej. Aby uzyskać dostęp do tego źródła wideo (z nakładką openCV), chcę wyprowadzić dane wyjściowe skryptu python openCV do strumienia VLC. Udało mi się uruchomić i uruchomić strumień i połączyć się z nim. Funkcja VLC zmienia rozmiar na prawidłowy współczynnik proporcji i rozdzielczość, aby uzyskać poprawne dane, ale obraz, który otrzymuję, jest po prostu 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}" & 

Wyjście skryptu jest stały strumień wideo wysyłane do stdout następująco

from imutils.video import WebcamVideoStream 

vs = WebcamVideoStream(src=0) 

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

Powyższy przykład jest dumbed dół wersja skryptu używam; Jak widać, korzystam z biblioteki imutils; https://github.com/jrosebr1/imutils

Gdyby ktokolwiek mógł mnie popchnąć we właściwym kierunku, byłbym bardzo wdzięczny. Domyślam się, że stdout.write (frame.tostring()) nie jest tym, czego oczekuje vlc, ale nie byłem w stanie sam tego rozgryźć.

+0

co masz na myśli, mówiąc, że obraz jest po prostu niestabilny? – incBrain

+0

Zasadniczo naprawdę zniekształcony obraz, który porusza się w górę po przekątnej. Niezupełnie związane z rzeczywistym kanałem wideo z kamery internetowej, o ile mogłem się zorientować. (Nie zmieniło się, gdy przeniosłem obiekty przed kamerą). Zgaduję, że VLC nie może interpetować danych frame.tostring(). –

+0

to prawdopodobnie niedopasowanie w formacie wideo. Czy jesteś pewien, że RV24 ma poprawny format wyjściowy? Upewnij się również, że wymiary pasują do: – incBrain

Odpowiedz

1

ten pracował dla mnie, chociaż ja posyłam do strumienia RTSP i nie używając imutils Biblioteka:

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

Następnie w wierszu poleceń:

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

pamiętać, że nie trzeba konwertować OpenCV BGR do RGB.