You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:47:02