我尝试了这么多的解决方案,但没有一个不起作用。这是我的简单代码,用于获取结果(rtsp流)。它正常工作,但我不能打开rtsp流。
第二个问题是如何设置像rtsp://192.168.1.158:8554/test这样的流名称。
首先,从Basler摄像机2获取摄像机的帧格式。创建视频捕获3;获取当前IP 4;为rtsp流5配置pip_out字符串;创建opencv写入器6;从摄像机读取帧并执行yolo检测(此处未显示) 7。在本地机器8上显示结果。将帧写入rtsp。
VLC不连接rtsp。当我尝试像这样在本地机器上打开它时:
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554 latency=100 !
queue ! rtph264depay ! h264parse ! avdec_h264 !
videoconvert ! videoscale ! video/x-raw,width=640,height=480 !
Xvimagesink它给了我跟随错误:
将管道设置为暂停..。 管道是活的,不需要预先处理. 进度:(开放)开放溪流 进度:(连接)连接到rtsp://localhost:8554 错误: from element /Gst管道:管线0/GstRTSPSrc:rtspsrc0 0:未能>打开读写资源。 其他调试信息: gstrtspsrc.c(7469):gst_rtspsrc_retrieve_sdp ():>/ rc:rtspsrc0 0: 连接失败。(通用错误) 错误:管道不想预先处理。
import subprocess as sb
import shlex as sh
import cv2
import socket
import time
def get_frame_format():
command = 'v4l2-ctl -d /dev/video0 --list-formats-ext'
args = sh.split(command)
p = sb.Popen(args, stdout=sb.PIPE, stderr=sb.STDOUT)
res = p.communicate()[0].split()
fps = float(res[-2].decode('utf-8')[1:])
size = list(map (int , res[19].decode('utf-8').split('x')))
width = size[0]
height = size[1]
return fps, width, height
fps, width, height = get_frame_format()
print (f"fps: {fps}, {type(fps)}\n, size: {width} {height}")
window_title = "USB Camera"
camera_id = "/dev/video0"
cam = cv2.VideoCapture(camera_id, cv2.CAP_V4L2)
#Get current IP for RTSP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip_address = s.getsockname()[0]
pipe_out = 'appsrc is-live=True ! queue ! videoconvert ! video/x-raw, format=RGBA ! nvvidconv\
! omxh264enc insert-sps-pps=true ! video/x-h264, stream-format=byte-stream! h264parse \
! rtph264pay name=pay0 pt=96 config-interval=1 ! udpsink port=8554 host=192.168.1.158'
rtsp_out = cv2.VideoWriter(pipe_out, fourcc=0, apiPreference=cv2.CAP_GSTREAMER, fps=fps,
frameSize=(1980, 1080), isColor=True)
time.sleep(2)
if not rtsp_out.isOpened() :
print("Writer failed")
exit()
print('Writer opened')
if cam.isOpened():
try:
window_handle = cv2.namedWindow(window_title, cv2.WINDOW_KEEPRATIO )
while True:
ok, frame = cam.read()
# Here frame neuro processing by yolo
# Showing result on local machine
if cv2.getWindowProperty(window_title, cv2.WND_PROP_AUTOSIZE) >=0:
frame_out = cv2.resize(frame, (1980, 1080))
cv2.imshow(window_title, frame_out)
# result streaming to rtsp
rtsp_out.write(frame_out)
else:
break
key = cv2.waitKey(1) & 0xFF
if key == 27 or key == ord("q"):
break
finally:
rtsp_out.release()
cam.release()
cv2.destroyAllWindows()
else:
print("Camera doesn't open")“”“
发布于 2022-06-13 18:00:05
您希望创建RTSP服务器,但管道使用的是udpsink。
'appsrc is-live=True ! queue ! videoconvert ! video/x-raw, format=RGBA ! nvvidconv\
! omxh264enc insert-sps-pps=true ! video/x-h264, stream-format=byte-stream! h264parse \
! rtph264pay name=pay0 pt=96 config-interval=1 ! udpsink port=8554 host=192.168.1.158'这是两个不同的因素。udpsink“正义”在UDP上发送帧。RTSP服务器所做的远不止这些:它提供RTSP,客户端可以在该API上下载SDP描述,然后对UDP端口进行嵌套,以打开UDP上的RTP流(或者可能是TCP),并公开RTCP。
最简单的方法可能是将gst-launch-1.0管道更改为使用udpsrc而不是rtspsrc。
如果您真的想要制作一个RTSP服务器,这就更复杂了(特别是因为它来自appsrc (在您的例子中,我认为您根本无法用Python实现这一点)。因此,可能更容易的方法是使用您的udpsink,并运行一个RTSP服务器,它将使用udpsrc来使用它。正式的实现是gst-rstp-server,它有示例这里,或者这个项目叫做“rtsp-”。可能会有所帮助。
我建议你分两步:
gst-launch-1.0创建一个udpsrc管道,并从您的python管道(上面有udpsink的管道)接收视频。udpsrc管道输入和RTSP服务器,要么使用gst-rtsp-server,要么使用rtsp-simple-server。https://stackoverflow.com/questions/72557335
复制相似问题