LeRobot 文件

串流視訊編碼指南

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

串流視訊編碼指南

1. 概覽

串流視訊編碼消除了視訊資料集錄製過程中傳統的 PNG 往返操作。與其執行

  1. 擷取影格 -> 將 PNG 寫入磁碟 -> (片段結束時) 讀取 PNG -> 編碼為 MP4 -> 刪除 PNG

不如在擷取期間即時編碼影格:

  1. 擷取影格 -> 加入編碼器執行緒佇列 -> 直接編碼為 MP4

這使得 save_episode() 幾乎能瞬間完成(片段結束時視訊已編碼完成),並消除了以往在片段之間發生的阻塞等待,對於長片段且有多個攝影機的情況尤其有效。

2. 調整參數

參數 CLI 旗標 類型 預設 說明
streaming_encoding --dataset.streaming_encoding bool True 啟用擷取期間的即時編碼
vcodec --dataset.vcodec str "libsvtav1" 視訊編解碼器。"auto" 可偵測最佳硬體編碼器
encoder_threads --dataset.encoder_threads int | None None (自動) 每個編碼器實例的執行緒數。None 表示由編解碼器自行決定
encoder_queue_maxsize --dataset.encoder_queue_maxsize int 60 每個攝影機的最大緩衝影格數(30fps 時約 2 秒)。會消耗記憶體 (RAM)

3. 效能考量

串流編碼代表 CPU 正在擷取迴圈期間進行視訊編碼,而非之後。這會產生 CPU 預算限制,必須在以下處理程序間共享:

  • 控制迴圈(讀取攝影機、控制機器人、寫入非視訊資料)
  • 編碼器執行緒(每個攝影機一個執行緒池)
  • Rerun 視覺化(若已啟用)
  • 作業系統與其他處理程序

解析度與攝影機數量的影響

設定 輸送量 (px/sec) CPU 編碼負載 備註:
2 攝影機 x 640x480x3 @30fps 55M 適用於大多數系統
2 攝影機 x 1280x720x3 @30fps 165M 適中 在現代系統上運作流暢
2 攝影機 x 1920x1080x3 @30fps 373M 需要高效能 CPU

encoder_threads 調整

此參數控制每個編碼器實例內部使用的執行緒數量

  • 較高值(例如 4-5):編碼速度更快,但每個攝影機消耗更多 CPU 核心。適用於擁有許多核心的高階系統。
  • 較低值(例如 1-2):每個攝影機消耗較少 CPU,為擷取與視覺化釋放核心。適用於低解析度影像與效能適中的 CPU。
  • None(預設值):由編解碼器自行決定。詳細資訊請參見編解碼器日誌。

背壓與影格丟棄

每個攝影機都有一個有限的佇列(encoder_queue_maxsize,預設為 60 個影格)。當編碼器速度跟不上時:

  1. 佇列填滿(消耗記憶體)
  2. 新的影格會被丟棄(不會阻塞)— 擷取迴圈繼續不中斷
  3. 系統會記錄警告:"Encoder queue full for {camera}, dropped N frame(s)"
  4. 在片段結束時,會回報每個攝影機丟棄的影格總數

編碼器落後的徵兆

  • 系統感到遲滯且凍結:所有 CPU 核心達到 100%
  • 影格丟棄警告:日誌中出現警告,或者錄製的資料集中影格數/FPS 低於預期
  • 機器人動作不連貫:如果 CPU 嚴重超載,甚至連擷取迴圈也可能受到影響
  • 累積的 Rerun 延遲:視覺化進度落後於即時狀態

4. 硬體加速編碼

何時使用

在以下情況使用硬體加速 (HW) 編碼:

  • CPU 成為瓶頸(出現丟棄影格、機器人動作不連貫、Rerun 延遲)
  • 您擁有相容的硬體(GPU 或專用編碼器)
  • 您正在以高輸送量錄製(高解析度或多攝影機)

選擇編解碼器

編解碼器 CPU 使用率 檔案大小 品質 (Quality) 備註:
libsvtav1 (預設) 最小 祝好 預設值。壓縮效果最好,但最消耗 CPU
h264 中等 約大 30-50% 良好 軟體編碼 H.264。CPU 消耗較低
硬體編碼器 極低 最大 良好 卸載至專用硬體。最適合 CPU 受限的系統

可用硬體編碼器

編碼器 平台 硬體 CLI 值
h264_videotoolbox macOS Apple Silicon / Intel --dataset.vcodec=h264_videotoolbox
hevc_videotoolbox macOS Apple Silicon / Intel --dataset.vcodec=hevc_videotoolbox
h264_nvenc Linux/Windows NVIDIA GPU --dataset.vcodec=h264_nvenc
hevc_nvenc Linux/Windows NVIDIA GPU --dataset.vcodec=hevc_nvenc
h264_vaapi Linux Intel/AMD GPU --dataset.vcodec=h264_vaapi
h264_qsv Linux/Windows Intel Quick Sync --dataset.vcodec=h264_qsv
auto Any 自動探測系統中的可用硬體編碼器。若未找到,會退回至 libsvtav1 --dataset.vcodec=auto

為了使用硬體加速編碼器,您可能需要更新 GPU 驅動程式。

libsvtav1 為預設值,因為它能提供最佳訓練效能;其他 vcodec 可降低 CPU 使用率並提升編碼速度,但通常會產生較大的檔案,並可能影響訓練時間。

5. 疑難排解

徵兆 可能原因 修正方法
系統凍結或機器人動作不連貫或 Rerun 視覺化延遲 CPU 負載過高 (100% 使用率) 關閉其他應用程式,降低編碼輸送量,調低 encoder_threads,使用 h264,使用 display_data=False。若 CPU 仍維持 100%,則代表硬體規格不足,請考慮 --dataset.streaming_encoding=false 或使用硬體編碼 (--dataset.vcodec=auto)
「Encoder queue full」警告或資料集影格丟棄 編碼器跟不上 (佇列溢位) 若 CPU 未達 100%:提高 encoder_threads,增加 encoder_queue_maxsize 或使用硬體編碼 (--dataset.vcodec=auto)。
高記憶體使用率 佇列累積速度快於編碼速度 encoder_threads 太低或 CPU 效能不足。請減少 encoder_queue_maxsize 或使用硬體編碼
大型視訊檔案 使用硬體編碼器或 H.264 這是預期的取捨。若 CPU 允許,請切換至 libsvtav1
save_episode() 仍然緩慢 streaming_encodingFalse 設定 --dataset.streaming_encoding=true
編碼器執行緒當機 編解碼器不可用或設定無效 檢查是否已安裝 vcodec,嘗試 --dataset.vcodec=auto
錄製的資料集遺失影格 CPU/GPU 資源匱乏或突發性的負載峰值 若遺失約 5% 的影格,您的系統可能負載過重 — 請遵循上述建議。若遺失影格較少(約 2%),則通常是由於偶發性的暫時性負載(通常在啟動時)所致,屬於正常預期範圍。

6. 建議設定

這些估算值較為保守;我們建議在您的設置上進行測試——從低負載開始並逐步增加。

高階系統:現代 12+ 核心 (24+ 執行緒)

約 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.vcodec=h264 --dataset.streaming_encoding=false ...

7. 結語

效能最終取決於您的確切設定——影格速率 (FPS)、解析度、CPU 核心與負載、可用記憶體、片段長度以及您選擇的編碼器。請務必針對您的目標工作負載進行測試,留意您的 CPU 與系統能力,並合理調整 encoder_threadsencoder_queue_maxsizevcodec。話雖如此,常見的實用配置(針對許多應用)是三個 640x480x3 @30fps 的攝影機;這在現代系統上通常能透過預設的串流視訊編碼設定順利運作。請務必透過比較視訊持續時間與 CLI 片段持續時間,並確認總影格數等於 FPS × CLI 持續時間,來驗證您錄製的資料集是否完整健康。

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.