ros_rtsp推流

1.首先下载ros_rtsp的推流包

https://github.com/CircusMonkey/ros_rtsp

然后根据github中的readme进行配置,主要是一些依赖的安装。 记得这是一个ros功能包,要在ros工作空间下进行编译。

这个功能包的主要功能是获取ros格式下的视频流,转换成rtsp格式。

我用的时候是获取的realsense d400相机的视频流进行推流的,要修改的主要是confige下面的stream_setup.yaml文件,修改内容如下:

# Set up your streams to rtsp here.
port: "8554"
streams: # Cannot rename - must leave this as is.

  stream-x:
    type: cam
    source: "v4l2src device=/dev/video0 ! videoconvert ! videoscale ! video/x-raw,framerate=15/1,width=1280,height=720"
    mountpoint: /front
    bitrate: 500

  stream-yay:
    type: topic
    source: /d400/color/image_raw
    mountpoint: /back
    caps: video/x-raw,framerate=10/1,width=640,height=480
    bitrate: 500

主要修改的是话题名称和caps中的分辨率。

然后在github中测试是在自己本地环境下测试的,也就是获取,然后在本地显示。也就是gstream部分,你需要下载gst-launch-1.0,按照github的流程下载即可。

vlc --no-audio --avcodec-hw=any --sout-rtp-proto=udp --network-caching=300 --sout-udp-caching=0 --clock-jitter=0 --rtp-max-misorder=0 rtsp://:8554/ :udp-timeout=0

上述测试命令中的server_ip是你电脑的ip,your_stream_mountpoint是config文件下的mountpoint值。

如果到此都没问题的话你就可以在自己电脑上看到推到的视频流。

同时也可以将读取的rtsp视频流推到远端,我是将得到的rtsp视频流推流到云端的rtmp流格式

import cv2
import subprocess
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
print("ip:",ip)
//上述是动态获取本地ip
rtsp = "rtsp://"+ip+":8554/back"
rtmp='rtmp://push.danruantech.com/robot/test?auth_key=1639540414-0-0-57d947ecd377e5ea37e6ffeabdb68dc7'
 //rtmp是推流的远端地址
# 读取视频并获取属性
cap = cv2.VideoCapture(rtsp)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
sizeStr = str(size[0]) + 'x' + str(size[1])
 
command = ['ffmpeg',
    '-y', '-an',
    '-f', 'rawvideo',
    '-vcodec','rawvideo',
    '-pix_fmt', 'bgr24',
    '-s', sizeStr,
    '-r', '25',
    '-i', '-',
    '-c:v', 'libx264',
    '-pix_fmt', 'yuv420p',
    '-preset', 'ultrafast',
    '-f', 'flv',
    rtmp]
 
pipe = subprocess.Popen(command
    , shell=False
    , stdin=subprocess.PIPE
)
 
while cap.isOpened():
    success,frame = cap.read()
    if success:
        '''
		对frame进行识别处理
		'''
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break    
        pipe.stdin.write(frame.tostring())
 
cap.release()
pipe.terminate()

主要参考:https://blog.csdn.net/zong596568821xp/article/details/92790502?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165016202616780274192050%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165016202616780274192050&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-92790502.nonecase&utm_term=rtmp&spm=1018.2226.3001.4450

你可能感兴趣的:(ubuntu,linux,运维)