机载视频流回传+编解码方案

发布于:2024-11-28 ⋅ 阅读:(42) ⋅ 点赞:(0)

无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s+),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持,软件编解码)或者h264(自己用gstreamer/ffmpeg/opencv写,并结合实际可用的硬件编码器进行编码)

视频流来源 发送方案 接收方案 优点 缺点

rtsp +

h264已编码

(IP摄像头)

转发rtsp推流

rtsp拉流 +

h264解码

(gstreamer/ffmpeg)

无额外开销 无法再压缩、修改画面

rtsp拉流 +

h264解码 (此处应有ROS image话题)+

h264编码(gstreamer) +

rtsp推流

rtsp拉流 +

h264解码

(gstreamer/ffmpeg)

在原rtsp h264流基础上可以再压缩 需要额外编码

ROS话题

image_transport republish (已经是的可省略) +

传输theora话题

接收theora话题 +

image_transport解码 +

republish image话题(仅rqt查看可省略)

通用 软件编码;无硬件加速

h264编码(gstreamer) +

rtsp推流

rtsp拉流 +

h264解码

(gstreamer/ffmpeg)

硬件加速 专用

 image_transport republish:输入话题是sensor_msgs/Image类型的,输出压缩的各类话题(compressed和theora默认),适用于image_raw话题不是由image_transport产生的情况。

rosrun image_transport republish raw in:=/usb_cam/image_raw out:=/usb_cam/image_raw/theora

 image_transport republish:输入话题是theora压缩过的,输出解压的raw话题

rosrun image_transport republish theora in:=camera/image raw out:=camera/image_decompressed

相关资源:

一些推流方案合集rtsp_除了ffmpeg推流-CSDN博客

rocon_rtsp_camera_relay:读取rtsp流,发布ROS图像话题(网络摄像头ROS驱动、拉流)

rocon_rtsp_camera_relay - ROS Wiki
第八章.ROS-RTSP流相机功能包 - HOMER图数传

这个包比较老了,拉流效果如何,能否用硬件解码器有待验证

gscam:gstramer读取usb/web camera,发布ROS图像话题(网络摄像头ROS驱动、拉流)

GitHub - ros-drivers/gscam: ROS Camera driver for GStreamer-based video streams.
gscam - ROS Wiki

可以用gscam,这是一个gstreamer框架的ROS包,读取的视频流来源可以是网络摄像头(rtspsrc)或者usb摄像头(v4lc),反正都是gstreamer框架的,可以选择解码器(比如jetson支持的nvv4l2decoder解码器),解码发布到sensor_msg/Image话题。

rtsp拉流+nvv4l2decoder解码+发布ROS图像话题(网络摄像头ROS驱动、拉流)

src/amov_gimbal_image_node.cpp · AMOVLAB/Gimbal-SDK-ROS - Gitee.com

这里是opencv拉rtsp流(h264压缩了的),性能可能不如gstreamer或者ffmpeg?用的是xavier NX上的nvv4l2decoder硬件解码器对h264数据进行解码,appsink sync=false表示没有同步,capture.read(frame);不会阻塞?cpu占用高?

video_stream_opencv 发布ROS图像话题(网络摄像头ROS驱动、拉流)

video_stream_opencv - ROS Wiki

读取ROS图像话题+omxh264enc编码+gstreamer rtsp推流(发送方案)低延时

Prometheus/Modules/object_detection/py_nodes/rtsp_stream/gstreamer_rtsp_stream.py at main · amov-lab/Prometheus · GitHub

在xavier NX上测试过。读取ROS图像话题,然后用xavier NX自带的omxh264enc硬件编码器(老旧,现在应该换成nvv4l2encoder)编码成h264的rtp udp数据包发送,然后用gstreamer启动rtsp server。async=false仍然是关闭了同步。 用rtsp动态改变推流参数?

ros_rtsp读取ROS话题+gstreamer rtsp推流(发送方案)

https://blog.csdn.net/qq_42257666/article/details/130559000

 ffmpeg_image_transport(ROS image和ffmpeg压缩解压的转换)

GitHub - daniilidis-group/ffmpeg_image_transport: image transport that uses libavcodec for compression

可以用到硬件加速,ffmpeg自带的,支持的硬件编解码器可能是PC端的,orin NX上还是用gstreamer的nvv4l2编解码器比较好。

rtsp_image_transport(ROS image和rtsp流的转换,拉流、推流)

GitHub - fkie/rtsp_image_transport: RTSP streaming for ROS image topics

解压和压缩用的是ffmpeg,支持硬件加速。既能拉流成ROS图像,也能推流ROS图像,比较全面。但由于是用的ffmpeg进行编解码,支持的硬件编解码器可能是PC端的,orin NX上还是用gstreamer的nvv4l2编解码器比较好。

rtsp拉流方法(地面端、rtsp拉流ROS驱动)

1. 程序VLC Media Player直接播放

2. opencv,解码还是调用的ffmpeg,如何设置解码器为硬件解码器?

3. gstreamer,默认是通过设置 decodebin 元素,GStreamer 会自动选择解码器,也可以设置硬件解码器nvv4l2decoder。

4. ffmpeg,自动调用H.264 解码器(libx264libavcodec),如何设置解码器为硬件解码器?

发送端:RTSP 流重新封装并转发

如果你的发送端需要从 RTSP 流获取视频数据并转发,可以使用以下 GStreamer 管道接收 RTSP 流并通过 UDP 传输 H.264 流:

gst-launch-1.0 rtspsrc location=rtsp://<rtsp-url> ! rtph264depay ! rtph264pay ! udpsink host=127.0.0.1 port=5000

适用于转发rtsp推流到地面端的情况,不用编码解码。

结论

1. 读取摄像头方案

  • 如果是usb/csi摄像头,一般会有驱动,realsense driver或者usb_cam或者gscam,最好有用到硬件解码的,发布出ROS话题。
  • 如果是rtsp流且h264压缩了的网络摄像头(吊舱),需要用opencv / gstreamer / ffmpeg读取rtsp流,解码,再发布出ROS话题。最好解码用到硬件解码器。

2. 机载推流(发送)方案

  • 最推荐:读取ROS话题,用opencv / gstreamer / ffmpeg进行h264编码,最好用硬件编码器。然后用gstreamer推送rtsp流。需要自己写程序。
  • 最简单:如果摄像头是rtsp流的且h264压缩的合适,可以不经过解码编码,直接转发这路rtsp流到地面端。之所以要转发而不是直接用这路rtsp流,是因为这路rtsp应该是用于机载读取发布ROS话题,可能不能再给地面端拉流。这种方法缺点是无法控制压缩参数,而且无法显示程序处理后的图像(比如加上一些识别框的图)。
  • 方便调试(此法注意theora话题刚订阅时会发送header一次,必须要传输到接收端):读取ROS话题,用image_transport republish产生theora话题(已经有的不需要),然后用swarm_ros_bridge转发theora话题到地面站。问题是theora编码是软件cpu的,用不了硬件加速,地面站看到的视频可能延迟比较大,同时swarm_ros_bridge建立连接后暂时不支持取消,地面端只能杀掉swarm_ros_bridge节点来停止传输。  关于theora,可以查看:usb_cam ros包话题说明,image transport包使用-CSDN博客

3. 地面端拉流(接收)方案

  • 最推荐:ubuntu上apt安装vlc播放器,直接可以看rtsp流。
  • 方便调试:rqt_image_view或者rviz查看theora话题。   关于theora,可以查看:usb_cam ros包话题说明,image transport包使用-CSDN博客
  • 用opencv / gstreamer / ffmpeg读取rtsp流,解码,写QT显示窗口,可以加入点选等功能。