将OpenCV输出发送到VLC流

2024-09-28 01:25:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这让我忙了一下午的大部分时间,我还没能让它工作,但我觉得我真的很接近。

我已经设置了openCV,它可以从网络摄像头获取视频。为了能够访问这个视频feed(使用openCV overlay),我想将openCV python脚本的输出管道化为一个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}" &

脚本的输出是一个发送到stdout的恒定视频源,如下所示

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所期望的,但我自己还没有弄清楚。


Tags: 脚本视频videostdoutwidthframeopencvflv
2条回答

这对我有效,尽管我正在发送到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。

下面是我在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中是默认的。

相关问题 更多 >

    热门问题