使用ROS1和Pycharm高效转换Realsense相机bag文件为MP4格式
1. 为什么需要转换Realsense的bag文件很多使用Intel Realsense相机的开发者都会遇到一个共同的问题相机记录的.bag文件虽然包含了丰富的传感器数据但在实际应用中往往只需要其中的RGB视频流。比如在做计算机视觉实验时我们可能只需要分析视频内容而不需要深度信息。这时候把整个bag文件导入处理就显得很笨重。我刚开始用Realsense时每次都要先播放bag文件再用屏幕录制工具截取视频效率低不说画质还会二次损失。后来发现用ROS1配合Pycharm可以直接提取视频流转换速度飞快一个1GB的bag文件不到1分钟就能转成MP4。更重要的是这种方法能保留原始画质不会出现转码损失。2. 环境准备与依赖安装2.1 基础环境配置首先确保你的Ubuntu系统已经安装了ROS1推荐Noetic版本。我测试过Ubuntu 18.04和20.04都没问题。如果你还没装ROS1可以先用下面这个命令安装基础版本sudo apt install ros-noetic-desktop-full装好后别忘了初始化rosdep这个在后面会用到sudo rosdep init rosdep update2.2 关键工具安装转换过程主要依赖两个工具ffmpeg和Python的ROS库。ffmpeg负责视频编码转换ROS库则用来解析bag文件。安装命令如下sudo apt update sudo apt install ffmpeg python3-roslib python3-sensor-msgs python3-opencv这里有个小技巧如果你发现安装的OpenCV版本太老比如低于4.0建议用pip单独安装新版pip install opencv-python4.5.5.643. 获取并配置转换工具3.1 下载转换脚本推荐使用mlaiacker开发的rosbag2video工具这个脚本我用过很多次稳定性很好git clone https://github.com/mlaiacker/rosbag2video cd rosbag2video这个仓库里的rosbag2video.py就是我们的核心工具。它通过解析bag文件中的/image_raw话题把视频流提取出来再用ffmpeg编码。3.2 Pycharm环境配置很多人在这一步会遇到导入错误主要是因为Pycharm找不到ROS的Python包。解决方法很简单在Pycharm中打开项目后点击File Settings找到Project Interpreter设置点击右侧的齿轮图标选择Show All点击号添加新的解释器路径添加ROS的Python包路径通常是/opt/ros/noetic/lib/python3.8/site-packages我建议直接复制这个路径避免手打出错。配置完成后代码中的import rospy应该就不会报错了。4. 执行转换操作4.1 准备bag文件把要转换的.bag文件放到rosbag2video目录下。这里有个细节要注意Realsense默认的视频话题是/camera/color/image_raw但有些录制配置可能会用其他话题名。如果转换失败可以先查看bag文件包含哪些话题rosbag info your_file.bag4.2 运行转换命令转换命令非常简单python rosbag2video.py input.bag如果你想指定输出视频的分辨率或帧率可以加参数python rosbag2video.py input.bag -r 30 -s 1280x720转换过程中如果看到no depth images的提示不用紧张这只是说明没有深度数据不影响RGB视频的转换。4.3 处理常见错误我遇到过几个典型问题报错ImportError: No module named cv_bridge需要安装python3-cv-bridge视频播放异常可能是ffmpeg编码问题尝试加参数-c h264_nvenc帧率不稳定检查录制时是否丢帧可以用-r参数强制指定帧率5. 优化与高级技巧5.1 批量转换脚本如果需要处理多个bag文件可以写个简单的bash脚本for file in *.bag; do python rosbag2video.py $file done5.2 视频后处理转换后的MP4文件如果想进一步处理可以用ffmpeg命令# 裁剪视频 ffmpeg -i output.mp4 -vf crop640:480:0:0 cropped.mp4 # 调整码率 ffmpeg -i output.mp4 -b:v 2M -maxrate 2M -bufsize 1M output_2M.mp45.3 提取特定时间段如果只需要bag文件中的某段时间可以先用rosbag filter截取rosbag filter input.bag output.bag t.to_sec() 1630000000 and t.to_sec() 16300010006. 替代方案对比除了rosbag2video.py还有其他几种转换方法使用rqt_bagGUI操作直观但效率低直接调用OpenCV灵活性高但代码量大rosbag_to_video工具功能更全但配置复杂实测下来对于只需要RGB视频的场景rosbag2video.py是最轻量高效的方案。它的优势在于单文件实现无需复杂配置支持实时进度显示自动处理时间同步问题7. 实际应用案例最近在一个室内导航项目中我们需要分析Realsense D435i拍摄的走廊视频。原始bag文件有20GB但实际只需要其中5分钟的RGB视频。使用这个方法后转换时间从原来的30分钟缩短到2分钟视频质量保持原始分辨率1920x1080方便用Premiere等工具进一步编辑另一个应用场景是数据集制作。我们录制了100个不同光照条件下的bag文件用批量脚本一夜之间就全部转成了MP4大大加快了标注进度。8. 性能优化建议处理大型bag文件时超过10GB可以尝试以下优化使用SSD硬盘存放bag文件增加rosbag2video.py的内存缓冲区大小关闭不必要的ROS节点释放资源在命令行前加time命令监控耗时time python rosbag2video.py large_file.bag对于特别大的文件建议分批次处理。比如先提取前10分钟视频确认效果后再处理剩余部分。