Firefly开源社区

标题: Gstreamer+python+opencv解码rtsp流失败 [打印本页]

作者: spp    时间: 2023-5-8 10:17
标题: Gstreamer+python+opencv解码rtsp流失败
本帖最后由 spp 于 2023-5-8 10:30 编辑

如题,我打算用Gstreamer+python+opencv解码rtsp流,查看并提取摄像头的画面,但是一直失败。
板子:AIO3588JQ
系统:Ubuntu20.04
固件:firefly AIO3588JQ的官方Ubuntu固件
Gstreamer:官方预安装的版本1.16.3
python:3.7.2
oepncv:4.5.0和4.x和4.3.0都用源码编译试过,gstreamer选项也编译进去了

下面是用oepncv获取rtsp流解码的代码
  1. import cv2
  2. import numpy as np
  3. import time
  4. import os
  5. def videocapture():
  6.     video_stream_path = 'rtspsrc location=rtsp://admin:Admin123@192.168.8.114//Streaming/Channels/1 latency=0 ! rtph264depay ! queue ! decodebin ! videoconvert ! appsink  drop=true'
  7.     cap = cv2.VideoCapture(video_stream_path,cv2.CAP_GSTREAMER)  # 生成读取摄像头对象
  8.     out_gst = 'appsrc is-live=true caps=video/x-raw,format=(string)BGR,framerate=(fraction)30/1 ! videoconvert !  ximagesink sync=false'
  9.     cap_out = cv2.VideoWriter(out_gst, cv2.VideoWriter_fourcc(*'H264'), 25, (1280, 720), True)
  10.     a = time.time()
  11.     while cap.isOpened():
  12.         ret, frame = cap.read()  # 读取摄像头画面
  13.         print(frame.shape)
  14.         cv2.imshow('video', frame)  # 显示画面
  15.         key = cv2.waitKey(1)
  16.         cap_out.write(frame)  # 视频保存
  17.         # 按Q退出
  18.         if key == ord('q'): # or count >=75:
  19.             break
  20.     cap.release()  # 释放摄像头
  21.     cap_out.release()
  22.     cv2.destroyAllWindows()  # 释放所有显示图像窗口
  23. if __name__ == '__main__':
  24.     videocapture()
复制代码


报错信息
  1. python test_save_capture_rtsp.py
  2. [ WARN:0] global /home/firefly/Downloads/opencv-4.3.0/modules/videoio/src/cap_gstreamer.cpp (898) open OpenCV | GStreamer warning: unable to query duration of stream
  3. [ WARN:0] global /home/firefly/Downloads/opencv-4.3.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=1, value=0, duration=-1
  4. (724, 1280, 3)

复制代码
图像的高多了4个像素,而且图像值都是0,画面一片黑色,也许是解码器的原因,但是我在终端用gstreamer命令行,又能够正常调用mppvideodec和decodebin插件解码,有正常的图像显示,放在opencv里又不行。
在opencv里用avdec_h264解码器解码,又是能正常显示的,但是用的软件解码,使用mppvideodec和decodebin硬件解码会报错





作者: 板蓝根    时间: 2023-6-5 18:00
这个用法不合理,opencv 想从 gstreamer appsink 拿数据会经过内存拷贝,性能很低,如果要用 python api 建议用 ffmedia,详情看 wiki FireflyLinux 使用手册
作者: spp    时间: 2023-6-8 11:42
板蓝根 发表于 2023-6-5 18:00
这个用法不合理,opencv 想从 gstreamer appsink 拿数据会经过内存拷贝,性能很低,如果要用 python api 建 ...

谢谢大佬指正,我去看看




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1