Отправка вывода OpenCV в поток VLC

Это занимало меня большую часть дня, и я не смог заставить его работать, но я чувствую, что я действительно близко.

Я установил openCV, который берет видео с веб-камеры. Чтобы иметь возможность получить доступ к этому каналу видео (с наложением openCV), я хочу направить вывод сценария Python openCV в поток VLC. Мне удалось запустить и запустить поток, и я могу подключиться к нему. VLC изменяет размеры до правильного соотношения сторон и разрешения, поэтому он получает некоторые правильные данные, но изображение, которое я получаю, просто дрожание;

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

Выходные данные скрипта - это постоянная видеокассета, отправляемая на стандартный вывод следующим образом.

from imutils.video import WebcamVideoStream

vs = WebcamVideoStream(src=0)

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

Вышеприведенный пример представляет собой скрытую версию скрипта, который я использую; Также, как видно, я использую библиотеку imutils; https://github.com/jrosebr1/imutils

Если бы кто-нибудь мог подтолкнуть меня в правильном направлении, я был бы очень признателен. Я предполагаю, что stdout.write(frame.tostring()) - это не то, чего ожидает vlc, но я сам не смог понять это.

2 ответа

Следующие работы для меня под 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()

И командная строка (моя веб-камера имеет другое разрешение, и я только отображаю результат, но у вас не было проблем с этим)

python opencv.py | vlc --demux=rawvideo --rawvid-fps=25 --rawvid-width=640 --rawvid-height=480 --rawvid-chroma=RV24 - --sout "#display" 

Конечно, для этого требуется преобразование из BGR в RGB, так как первое из них по умолчанию в OpenCV.

Это сработало для меня, хотя я отправляю в поток 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.

Другие вопросы по тегам