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://<server_ip>:8554/<your_stream_mountpoint> :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()