LeRobot documentation

流式视频编码指南

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

流式视频编码指南

1. 概述

流式视频编码消除了视频数据集录制过程中的传统 PNG 往返操作。而不是:

  1. 捕获帧 -> 将 PNG 写入磁盘 -> (回合结束时)读取 PNG -> 编码为 MP4 -> 删除 PNG

帧可以在捕获过程中实时编码:

  1. 捕获帧 -> 排队至编码器线程 -> 直接编码为 MP4

这使得 save_episode() 几乎可以即时完成(在剧集结束时视频已经编码完毕),并消除了剧集之间先前存在的阻塞等待,尤其是在长剧集中使用多个摄像头时。

2. 调整参数

参数CLI 标志类型默认描述
streaming_encoding--dataset.streaming_encodingboolFalse在捕获期间启用实时编码
vcodec--dataset.rgb_encoder.vcodecstr"libsvtav1"视频编解码器。"auto" 可自动检测最佳硬件编码器
encoder_threads--dataset.encoder_threadsint \| NoneNone(自动)每个编码器实例的线程数。None 将交由 vcoded 自行决定
encoder_queue_maxsize--dataset.encoder_queue_maxsizeint30每个摄像头的最大缓冲帧数(30fps 下约 1 秒)。会占用内存

3. 性能考量

流式编码意味着 CPU 在捕获循环期间对视频进行编码,而不是在循环结束后进行。这会产生一个 CPU 预算,需要在以下各项之间共享:

  • 控制循环(读取摄像头、控制机器人、写入非视频数据)
  • 编码器线程(每个摄像头一个线程池)
  • 重新运行可视化(如果已启用)
  • 操作系统和其他进程

分辨率和摄像头数量的影响

设置吞吐量(像素/秒)CPU 编码加载备注
2camsx 640x480x3 @30fps55M低适用于大多数系统
2camsx 1280x720x3 @30fps165M中等在现代系统上运行流畅
2camsx 1920x1080x3 @30fps373M高需要强大的高端 CPU

encoder_threads 调优

此参数控制每个编码器实例内部使用的线程数:

  • 较高的值(例如 4-5):编码速度更快,但每个摄像头占用的 CPU 核心数更多。适用于拥有大量核心的高端系统。
  • 较低的值(例如 1-2):每个摄像头占用的 CPU 更少,从而为核心释放资源用于捕获和可视化。适用于低分辨率图像和性能较强的 CPU。
  • None(默认值):由编解码器自行决定。相关信息可在编解码器日志中查看。

背压与帧丢弃

每个相机都有一个有界队列(encoder_queue_maxsize,默认 30 帧)。当编码器无法跟上时:

  1. 队列填满(消耗 RAM)
  2. 新帧会被丢弃(而非阻塞)——捕获循环持续不间断地运行
  3. 会记录一条警告:"Encoder queue full for {camera}, dropped N frame(s)"
  4. 在回合结束时,会报告每个相机的总丢帧数

编码器落后的症状

  • 系统感觉卡顿并冻结:所有 CPU 均达到 100%
  • 日志中出现的 丢帧警告,或录制数据集中帧数/FPS 低于预期
  • 机器人动作卡顿:如果 CPU 严重过载,即使是捕获循环也可能受到影响
  • 累积重跑延迟:可视化落后于实时

4. 硬件加速编码

何时使用

在以下情况下使用硬件编码:

  • CPU 是瓶颈(出现丢帧、机器人动作卡顿、rerun 延迟)
  • 您拥有兼容的硬件(GPU 或专用编码器)
  • 您正在以高吞吐量进行录制(高分辨率或使用多个摄像头)

选择编解码器

编解码器CPU 使用率文件大小质量备注
libsvtav1(默认)高最小最佳默认。压缩效果最佳,但 CPU 负载最高
h264中等~30-50% 更大好的软件 H.264。更低的 CPU
硬件编码器非常低最大好的卸载到专用硬件。最适合 CPU 受限的系统

可用的硬件编码器

编码器平台硬件CLI 值
h264_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=h264_videotoolbox
hevc_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=hevc_videotoolbox
h264_nvencLinux/WindowsNVIDIA GPU--dataset.rgb_encoder.vcodec=h264_nvenc
hevc_nvencLinux/WindowsNVIDIA GPU--dataset.rgb_encoder.vcodec=hevc_nvenc
h264_vaapiLinuxIntel/AMD 显卡--dataset.rgb_encoder.vcodec=h264_vaapi
h264_qsvLinux/WindowsIntel Quick Sync--dataset.rgb_encoder.vcodec=h264_qsv
auto任意探测系统中可用的硬件编码器。如果未找到硬件编码器,则回退到 libsvtav1--dataset.rgb_encoder.vcodec=auto

要使用硬件加速编码器,您可能需要升级 GPU 驱动程序。

libsvtav1 是默认选项,因为它能提供最佳的训练性能;其他 vcodecs 可以降低 CPU 占用并提升速度,但通常会产生更大的文件,并可能影响训练时间。

5. 故障排除

症状可能的原因修复
系统冻结或机器人动作卡顿或 Rerun 可视化延迟CPU 资源不足(负载使用率 100%)关闭其他应用程序,降低编码吞吐量,调低 encoder_threads,使用 h264,使用 display_data=False。如果 CPU 仍然持续处于 100% 状态,则可能无法满足您的配置需求,请考虑使用 --dataset.streaming_encoding=false 或硬件编码(--dataset.rgb_encoder.vcodec=auto)
数据集中出现“Encoder queue full”警告或丢帧编码器跟不上(队列溢出)如果 CPU 未达到 100%:请增加 encoder_threads,增加 encoder_queue_maxsize,或使用硬件编码(--dataset.rgb_encoder.vcodec=auto)。
高内存使用队列填充速度超过编码速度encoder_threads 设置过低或 CPU 资源不足。请降低 encoder_queue_maxsize 或改用硬件编码
大型视频文件使用硬件编码器或 H.264预期的权衡。如果 CPU 允许,请切换到 libsvtav1
save_episode() 仍然很慢streaming_encoding 为 False设置 --dataset.streaming_encoding=true
编码器线程崩溃编解码器不可用或设置无效检查 vcodec 是否已安装,尝试使用 --dataset.rgb_encoder.vcodec=auto
记录的 dataset 缺少 framesCPU/GPU 资源耗尽或偶发的负载峰值如果约 5% 的帧丢失,您的系统很可能已过载——请遵循上述建议。如果丢失的帧较少(约 2%),它们可能是由偶尔的瞬时负载峰值(通常在启动时)引起的,可以视为预期行为。

6. 推荐配置

这些估算较为保守;我们建议您在自己的环境中进行测试——从低负载开始,逐步增加负载。

高端系统:现代 12 核及以上(24 线程及以上)

在 CPU 上,约 250-500M px/sec 的吞吐量应该比较舒适。如果可用,尝试使用硬件编码以获得更好的效果。

# 3camsx 1280x720x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
# 2camsx 1920x1080x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
lerobot-record --dataset.encoder_threads=5 ...

# 3camsx 1920x1080x3 @30fps: Might require some tuning.

中端系统:现代 8 核及以上(16 线程及以上)或 Apple Silicon

在 CPU 上,吞吐量应可达到约 80-300M px/sec。

# 3camsx 640x480x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
# 2camsx 1280x720x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
lerobot-record --dataset.encoder_threads=2 ...

# 2camsx 1920x1080x3 @30fps: Might require some tuning.

低资源系统:现代 4 核及以上(8 线程及以上)或 Raspberry Pi 5

在资源非常受限的系统上,流式编码可能会与捕获循环产生过重的竞争。禁用该功能会回退到基于 PNG 的方案,其中编码发生在回合之间(会阻塞,但不会干扰捕获)。或者,以较低的吞吐量进行录制,以降低捕获和编码的负载。还可以考虑将编解码器更改为 h264 并使用批量编码。

# 2camsx 640x480x3 @30fps: Requires some tuning.

# Use H.264, disable streaming, consider batching encoding
lerobot-record --dataset.rgb_encoder.vcodec=h264 --dataset.streaming_encoding=false ...

7. 结语

性能最终取决于您的具体配置——每秒帧数、分辨率、CPU 核心数及负载、可用内存、回合长度以及您选择的编码器。请务必针对目标工作负载进行测试,注意您的 CPU 及系统能力,并合理调整 encoder_threads、encoder_queue_maxsize 和 vcodec。话虽如此,一种常见的实用配置(适用于许多应用)是三台相机以 640×480x3 @30fps 运行;在现代系统中,这通常可以配合默认的流式视频编码设置正常运行。请始终通过将视频时长与 CLI 回合时长进行比较,并确认行数等于 FPS × CLI 时长,来验证您记录的 dataset 是否健康。

Update on GitHub