首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV和gstreamer rtsp服务器

OpenCV和gstreamer rtsp服务器
EN

Stack Overflow用户
提问于 2022-02-23 22:52:30
回答 1查看 2.5K关注 0票数 2

我正在尝试设置一个rtsp服务器,在与OpenCV编辑后重新流一个IP相机的rtsp流。捕获rtsp流并编辑框架,但我无法使rtsp服务器正常工作。我收到以下错误消息:

代码语言:javascript
复制
[ WARN:0] global /home/pi/opencv/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (896) open OpenCV | GStreamer warning: unable to query duration of stream
[ WARN:0] global /home/pi/opencv/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (933) open OpenCV | GStreamer warning: Cannot query video position: status=1, value=0, duration=-1
[ WARN:0] global /home/pi/opencv/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module appsrc0 reported: Internal data stream error.
[ WARN:0] global /home/pi/opencv/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (1663) writeFrame OpenCV | GStreamer warning: Error pushing buffer to GStreamer pipeline

正如您在下面的代码中所看到的,我尝试了两个不同的管道,但它们都接收相同的错误消息。

我试图通过rtsp://192.168.y.y:8554/test访问VLC播放器中的rtsp流,但无法建立连接。

我的错误在哪里?对调试有什么建议吗?我对GStreamer没有经验。

我使用Python: 3.7.3,OpenCV: 4.1.1,GStreamer: 1.14.4.0

代码语言:javascript
复制
import time
import cv2
import sys
print("Python: {}".format(sys.version))
print("OpenCV: {}".format(cv2.__version__))

import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
gi.require_version('GstApp', '1.0')
from gi.repository import Gst, GLib, GstApp, GstRtspServer, GObject

print("Gst: {}.{}.{}.{}".format(*Gst.version()))

_ = GstApp
__ = GstRtspServer

Gst.init()

camSet_h265 = 'rtspsrc location=rtsp://192.168.x.x:8554/12 latency=0 buffer-mode=auto ! queue ! rtph265depay ! h265parse ! avdec_h265 ! videoconvert ! video/x-raw, format=BGR ! appsink drop=1'
camSet = camSet_h265

pipe_out = 'appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw, format=BGRx ! videoconvert ! x264enc speed-preset=veryfast tune=zerolatency bitrate=800 ! h264parse ! rtph264pay name=pay0 pt=96 config-interval=1'
# pipe_out = ' appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! h264parse ! rtph264pay name=pay0 pt=96 config-interval=1'


cam= cv2.VideoCapture(camSet, cv2.CAP_GSTREAMER)
time.sleep(2)

ret, frame = cam.read()
frame_num = int(cam.get(cv2.CAP_PROP_FRAME_COUNT))
frame_width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_fps = int(cam.get(cv2.CAP_PROP_FPS))

fourcc_fmt = cv2.VideoWriter_fourcc(*'X264')
out = cv2.VideoWriter(pipe_out, fourcc=fourcc_fmt, apiPreference=cv2.CAP_GSTREAMER, fps=frame_fps, frameSize=(frame_width, frame_height), isColor=True)
time.sleep(2)

while 1:
    ret, frame = cam.read()
    cv2.rectangle(frame,(20,100),(200,300),(0,255,0),8)
    # cv2.imshow('nanoCam',frame)
    out.write(frame)
    if cv2.waitKey(1)==ord('q'):
        break
cam.release()
cv2.destroyAllWindows()
EN

回答 1

Stack Overflow用户

发布于 2022-03-06 18:38:01

主要原因是您的写入器管道没有接收器。从opencv中,您可以更好地使用RTP流添加udpsink (在pay0之后附加于测试启动):

代码语言:javascript
复制
# Multicast to LAN (better avoid with wifi)
pipe_out = 'appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw, format=BGRx ! videoconvert ! x264enc speed-preset=veryfast tune=zerolatency bitrate=800 insert-vui=1 ! h264parse ! rtph264pay name=pay0 pt=96 config-interval=1 ! udpsink port=5004 host=224.1.1.1'

# Single receiver
pipe_out = 'appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw, format=BGRx ! videoconvert ! x264enc speed-preset=veryfast tune=zerolatency bitrate=800 insert-vui=1 ! h264parse ! rtph264pay name=pay0 pt=96 config-interval=1 ! udpsink port=5004 host=target_host_IP auto-multicast=0'

还请注意,对gstreamer后端来说,fourcc是无用的,所以只需使用0。

然后您将为接收方创建一个SDP文件,如:

代码语言:javascript
复制
m=video 5004 RTP/AVP 96
c=IN IP4 224.1.1.1
a=rtpmap:96 H264/90000

确保没有防火墙规则可以阻止UDP/5004从服务器到接收端。然后,您可以在打开SDP文件时接收到:

代码语言:javascript
复制
cvlc test.sdp

如果您确实希望使用RTSP流(这将自动将SDP发送到客户端),则可以使用shm接收器/shmsrc(如这里 ),但这不是一个有效的解决方案,它可能有一些CPU开销,因此如果尝试这一点,您还将检查CPU的使用情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71244959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档