首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经过openCV的帧转换处理后,我要做rtsp流。如何用GStreamer做这件事?

经过openCV的帧转换处理后,我要做rtsp流。如何用GStreamer做这件事?
EN

Stack Overflow用户
提问于 2022-06-09 08:48:35
回答 1查看 657关注 0票数 1

我尝试了这么多的解决方案,但没有一个不起作用。这是我的简单代码,用于获取结果(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。当我尝试像这样在本地机器上打开它时:

代码语言:javascript
复制
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: 连接失败。(通用错误) 错误:管道不想预先处理。

代码语言:javascript
复制
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")

“”“

EN

回答 1

Stack Overflow用户

发布于 2022-06-13 18:00:05

您希望创建RTSP服务器,但管道使用的是udpsink

代码语言:javascript
复制
'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-”。可能会有所帮助。

我建议你分两步:

  1. 使用gst-launch-1.0创建一个udpsrc管道,并从您的python管道(上面有udpsink的管道)接收视频。
  2. 一旦1工作,尝试将这个udpsrc管道输入和RTSP服务器,要么使用gst-rtsp-server,要么使用rtsp-simple-server
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72557335

复制
相关文章

相似问题

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