如何在ROS中通过Python向已有rosbag添加MP4文件?
如何用Python将MP4文件添加到已有ROS Bag中
核心逻辑
ROS Bag本身不支持直接存储MP4这类二进制文件,需要把MP4的二进制数据流封装到ROS标准消息(比如std_msgs/ByteMultiArray)里,再以追加模式写入目标Bag。
具体操作步骤
1. 读取MP4文件的二进制数据
先把本地MP4文件读成字节流:
def read_mp4_to_bytes(mp4_path): with open(mp4_path, 'rb') as f: return f.read()
2. 封装成ROS消息并初始化Bag写入器
导入依赖包,把字节流转成ByteMultiArray消息,同时以追加模式打开已有Bag:
import rosbag import rospy from std_msgs.msg import ByteMultiArray # 替换成你的目标Bag路径和MP4文件路径 target_bag = "your_existing_bag.bag" mp4_file = "target_video.mp4" # 读取MP4并转成ROS消息格式 mp4_byte_data = read_mp4_to_bytes(mp4_file) mp4_msg = ByteMultiArray() mp4_msg.data = list(mp4_byte_data) # ByteMultiArray.data要求是列表类型
3. 将消息写入Bag
指定一个自定义话题(比如/stored_mp4),搭配合适的时间戳写入Bag:
with rosbag.Bag(target_bag, 'a') as bag: # 用当前ROS时间作为时间戳,也可以换成Bag内已有数据的时间戳来对齐 write_timestamp = rospy.Time.now() bag.write('/stored_mp4', mp4_msg, write_timestamp)
4. 验证写入结果
用命令行查看Bag的话题信息,确认新话题已添加:
rosbag info your_existing_bag.bag
也可以用Python读取Bag数据,还原MP4文件验证完整性:
def write_bytes_to_mp4(byte_list, output_path): with open(output_path, 'wb') as f: f.write(bytes(byte_list)) with rosbag.Bag(target_bag, 'r') as bag: for topic, msg, t in bag.read_messages(topics=['/stored_mp4']): write_bytes_to_mp4(msg.data, "extracted_test.mp4")
注意事项
- 如果MP4文件过大,单次写入
ByteMultiArray可能触发ROS消息大小限制,建议拆分数据分多次写入,或者自定义分块消息类型。 - 时间戳尽量和Bag内已有数据的时间范围匹配,避免后续回放时时间轴混乱。
- 确保Python环境处于ROS工作空间的激活状态,保证
rosbag、rospy依赖可用。
内容的提问来源于stack exchange,提问作者NaZalan
相关产品推荐
相关产品推荐

