运行 来自 opencv videowriter api 的 gstreamer 管道命令将连续图像流式传输到 hlssink

running gstreamer pipeline command from opencv videowriter api to stream continuous image to hlssink

我正在尝试使用 opencv videowriter api 从视频卡设备流式传输连续图像,下面是执行操作的 opencv 代码片段,我的问题是我正在获取帧但没有获取任何帧在 /var/www 文件夹内生成的 index.m3u8 文件 我是 opencv 的新手,gstreamer 无法确定这是否可以从 opencv 实现,或者我必须使用其他机制

input video device is a video card which supports only MJEPG codec

import cv2

cap = cv2.VideoCapture('/dev/video0')
framerate = 30.0

out = cv2.VideoWriter('appsrc ! image/jpeg ! '
                      'jpegdec ! x264enc tune=zerolatency ! '
                      'mpegtsmux ! hlssink location=/var/www/segment-%05d.ts '
                      'playlist-location=/var/www/index.m3u8 max-files=20 target-duration=15',
                      0, framerate, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if ret:
        out.write(frame)
    else:
        break

# Release everything if job is finished
cap.release()
out.release()

OpenCv 的 VideoWriter 仅在其 GStreamer 接口上支持 BGR 帧。可能 VideoCapture 也会将图像转换为 BGR。

所以您不需要在 gstreamer 管道中解码 jpeg。但是 x264enc 并不总是接受 BGR 作为输入,因此您应该在 appsrc 和 x264enc`

之间添加 videoconvert
t = cv2.VideoWriter('appsrc ! videoconvert ! x264enc tune=zerolatency ! '
                      'mpegtsmux ! hlssink location=/var/www/segment-%05d.ts '
                      'playlist-location=/var/www/index.m3u8 max-files=20 target-duration=15',
                      0, framerate, (640, 480))