首页 > 解决方案 > 从 opencv videowriter api 运行 gstreamer 管道命令以将连续图像流式传输到 hlssink

问题描述

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

输入视频设备是仅支持 MJEPG 编解码器的视频卡

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

标签: pythonopencvgstreamerhttp-live-streaminghlsl

解决方案


OpenCvVideoWriter仅在其 GStreamer 接口上支持 BGR 帧。可能VideoCapture还会将图像转换为 BGR。

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

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

推荐阅读