python - 将 OpenCV 输出发送到 VLC 流

标签 python opencv vlc

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

我已经设置了 openCV,它从网络摄像头获取视频源。为了能够访问此视频提要(使用 openCV 覆盖),我想将 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}" &

脚本的输出是发送到标准输出的恒定视频提要,如下所示

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

最佳答案

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

关于python - 将 OpenCV 输出发送到 VLC 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36579542/

相关文章:

python - 如何同时将多个掩码应用于数据框?

python - 使用 SymPy 绘图

c++ - 找不到程序 .dll 文件

c++ - 使用 OpenCV/C++ 设置树莓相机模式

python - libvlc "VLC is unable to open the MRL ' C :\Users\Public\Videos\Sample Videos\Wildlife. mwv'"

python - 在 Heroku 应用程序中同时运行 Django 和 Node

python - 如何在使用和不使用 SQLAlchemy 的情况下处理 MySQL 上时区感知日期时间对象的 "out of range"警告

c++ - OpenCV Mat 导致 SIGABRT 崩溃

ubuntu - 使用 VLC 在两个屏幕上显示视频

opencv - 内存中 libvlc 流图像时的主要输入错误和延迟