流式视频编码消除了视频 dataset 录制过程中传统的 PNG 往返(round-trip)流程。不再需要:
帧可以在捕获期间实时编码:
这使得 save_episode() 几乎即时完成(episode 结束时视频已编码完毕),并消除了以前在 episode 之间出现的阻塞等待,尤其是在长时间 episode 中使用多个相机时。
| 参数 | CLI 标志 | 类型 | 默认值 | 描述 |
|---|---|---|---|---|
streaming_encoding | --dataset.streaming_encoding | bool | True | 在捕获期间启用实时编码 |
vcodec | --dataset.rgb_encoder.vcodec | str | "libsvtav1" | 视频编解码器。"auto" 会检测最佳的硬件编码器 |
encoder_threads | --dataset.encoder_threads | int \| None | None(自动) | 每个编码器实例的线程数。设为 None 将由编解码器自行决定 |
encoder_queue_maxsize | --dataset.encoder_queue_maxsize | int | 30 | 每台相机的最大缓冲帧数(30fps 下约 1 秒)。会消耗内存 |
流式编码意味着 CPU 在捕获循环期间(而非之后)编码视频。这产生了一个必须由以下各方共享的 CPU 预算:
| 配置 | 吞吐量(像素/秒) | CPU 编码负载 | 说明 |
|---|---|---|---|
| 2camsx 640x480x3 @30fps | 55M | 低 | 在大多数系统上均可运行 |
| 2camsx 1280x720x3 @30fps | 165M | 中等 | 在现代化系统上运行舒适 |
| 2camsx 1920x1080x3 @30fps | 373M | 高 | 需要强劲的高端 CPU |
此参数控制每个编码器实例在内部使用的线程数:
None(默认):由编解码器自行决定。可在编解码器日志中查看相关信息。每台相机都有一个有界队列(encoder_queue_maxsize,默认 30 帧)。当编码器跟不上时:
"Encoder queue full for {camera}, dropped N frame(s)"在以下情况使用硬件编码:
| 编解码器 | CPU 使用 | 文件大小 | 质量 | 说明 |
|---|---|---|---|---|
libsvtav1(默认) | 高 | 最小 | 最佳 | 默认。压缩率最好但最耗费 CPU |
h264 | 中等 | 大约大 30-50% | 良好 | 软件 H.264。CPU 占用更低 |
| 硬件编码器 | 极低 | 最大 | 良好 | 卸载到专用硬件。最适合 CPU 受限的系统 |
| 编码器 | 平台 | 硬件 | CLI 值 |
|---|---|---|---|
h264_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=h264_videotoolbox |
hevc_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=hevc_videotoolbox |
h264_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=h264_nvenc |
hevc_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=hevc_nvenc |
h264_vaapi | Linux | Intel/AMD GPU | --dataset.rgb_encoder.vcodec=h264_vaapi |
h264_qsv | Linux/Windows | Intel Quick Sync | --dataset.rgb_encoder.vcodec=h264_qsv |
auto | 任意 | 探测系统中可用的硬件编码器。如果找不到硬件编码器,则回退到 libsvtav1 | --dataset.rgb_encoder.vcodec=auto |
要使用硬件加速编码器,你可能需要升级 GPU 驱动程序。
libsvtav1是默认选择,因为它能提供最佳的训练性能;其他 vcodec 可以降低 CPU 占用并更快,但它们通常会产生更大的文件,并可能影响训练时间。
| 症状 | 可能的原因 | 修复方法 |
|---|---|---|
| 系统冻结、机器人运动卡顿或重放可视化滞后 | CPU 资源不足(100% 负载使用率) | 关闭其他应用、降低编码吞吐量、调低 encoder_threads、改用 h264、使用 display_data=False。如果 CPU 持续处于 100%,则可能对你的配置来说不够用,请考虑 --dataset.streaming_encoding=false 或硬件编码(--dataset.rgb_encoder.vcodec=auto) |
| dataset 出现 “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 缺少帧 | CPU/GPU 资源不足或偶发负载尖峰 | 如果约 5% 的帧缺失,你的系统可能已过载——请遵循上面的建议。如果缺失的帧较少(约 2%),则可能是偶发的瞬时负载尖峰(通常在启动时)所致,可以视为正常现象。 |
这些估算偏保守;我们建议在你的环境中测试——从较低负载开始,并逐渐增加。
约 250-500M 像素/秒的吞吐量在 CPU 上应该可以轻松实现。如果可用的话,尝试硬件编码以获得更好的结果。
# 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.约 80-300M 像素/秒的吞吐量在 CPU 上应该可以做到。
# 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.在资源非常受限的系统上,流式编码可能会与捕获循环过度争抢资源。禁用它将回退到基于 PNG 的方式,即在 episode 之间进行编码(阻塞,但不会干扰捕获)。另外,也可以以较低的吞吐量录制,以同时降低捕获和编码的负载。还可以考虑将编解码器改为 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 ...性能最终取决于你的具体配置——每秒帧数、分辨率、CPU 核心数与负载、可用内存、episode 时长,以及你选择的编码器。请始终用你的目标工作负载进行测试,注意 CPU 与系统能力,并合理地调整 encoder_threads、encoder_queue_maxsize 和 vcodec。话虽如此,一个常见且实用的配置(适用于许多应用)是三台相机以 640×480x3 @30fps 运行;在现代系统上,这通常可以配合默认的流式视频编码设置顺畅运行。请始终通过比较视频时长与 CLI episode 时长,并确认行数等于 FPS × CLI 时长,来验证录制的 dataset 是否健康。