从 rtsp 相机捕获视频流并将其写入文件

Capture a video stream from rtsp camera and write it to a file

提问人:Giorgos Betsos 提问时间:11/14/2023 最后编辑:Christoph RackwitzGiorgos Betsos 更新时间:11/15/2023 访问量:64

问:

我正在尝试捕获来自 rtsp 相机的视频流并将其写入文件。将 Jetson Xavier AGX 与 Jetpack 4.5 配合使用 [L4T 32.5.0]

我正在使用下面的python应用程序来执行任务:

cap = cv2.VideoCapture("rtspsrc location=rtsp://10.34.134.1/Streaming/channels/1/ user-id=myuser user-pw=mypass !  rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink")

w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
print('Src opened, %dx%d @ %d fps' % (w, h, fps))

gst_out = "appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv ! nvv4l2h264enc ! h264parse ! matroskamux ! filesink location=test.mkv "
out = cv2.VideoWriter(gst_out, cv2.CAP_GSTREAMER, 0, float(fps), (int(w), int(h)))
if not out.isOpened():
   print("Failed to open output")
   exit()

if cap.isOpened():
   while True:
      ret_val, img = cap.read()
      if not ret_val:
         break;
      out.write(img);
      cv2.waitKey(1)
else:
   print ("pipeline open failed")

cap.release()
out.release()

打开流不起作用。我收到以下错误:

[错误:[电子邮件保护]] 全局 /io/opencv/modules/videoio/src/cap.cpp (164) open VIDEOIO(CV_IMAGES):引发 OpenCV 异常:

OpenCV(4.6.0) /io/opencv/modules/videoio/src/cap_images.cpp:253: 错误:(-5:错误的参数)CAP_IMAGES:找不到起始号码(在 文件名):rtspsrc 位置=rtsp://10.34.134.1/Streaming/channels/1/ user-id=myuser user-pw=mypass !RTPH264德佩!h264解析!nvv4l2解码器!nvvidconv !video/x-raw,格式=BGRx !视频转换 !video/x-raw,format=BGR ! 函数“icvExtractPattern”中的appsink

我可以以某种方式修改提供给cv2的字符串吗?VideoCapture 以便正确读取 rtsp 流?

python opencv 视频流 gstreamer nvidia-jetson

评论

1赞 Christoph Rackwitz 11/14/2023
您的 OpenCV 是用 GStreamer 构建的吗? -- 为什么不将CAP_GSTREAMER也传递给 VideoCapture 构造函数?getBuildInformation()
0赞 Giorgos Betsos 11/15/2023
看来我的 opencv 版本不是用 gstreamer 构建的

答:

2赞 Christoph Rackwitz 11/15/2023 #1

如果您的 OpenCV 附带了 GStreamer 支持,那么您的调用应该已经成功了。 可以识别管道字符串。这甚至可以在不明确指定后端的情况下工作。VideoCapture()CAP_GSTREAMER

每当 OpenCV 谈论 时,这意味着没有其他后端对“目标”负责并设法“打开”它。 是优先级最低的后端,最后尝试。CAP_IMAGESCAP_IMAGES

发生这种情况时,请检查输出中的视频 I/O 部分

import cv2 as cv
print(cv.getBuildInformation())

在带有官方软件包的 Windows 上,这可能如下所示:

...
  Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES (prebuilt binaries)
      avcodec:                   YES (58.134.100)
      avformat:                  YES (58.76.100)
      avutil:                    YES (56.70.100)
      swscale:                   YES (5.9.100)
      avresample:                YES (4.0.0)
    GStreamer:                   NO
    DirectShow:                  YES
    Media Foundation:            YES
      DXVA:                      YES
...

如果您的 OpenCV 版本没有附带 GStreamer,您可以自己构建 OpenCV,支持 GStreamer,或者您可以四处寻找它附带的版本。您的操作系统可能有一个包管理器,它提供具有 GStreamer 支持的 OpenCV 的第三方版本。据我所知,官方软件包不包括这个。

若要确保获取特定的后端,请为 either 或构造函数的参数传递或其他标识符。cv.CAP_GSTREAMERapiPreferenceVideoCapture()VideoWriter()

cap = cv.VideoCapture(your_gst_pipeline, apiPreference=cv.CAP_GSTREAMER)

评论

0赞 Giorgos Betsos 11/15/2023
谢谢@Christoph。该问题是由于 opencv 不是使用 GStreamer 构建的。