RDK x5运行vio2encoder示例丢帧问题

:bullseye: 核心结论:1080p@30fps 双目是 X5+IMX219 的物理极限

根据官方最新回复(Marcelo6151 在 topic 35339),双路 1080p@30fps 在理论能力范围内,但实际稳定性取决于多个系统级因素


:magnifying_glass_tilted_left: 问题根因确认

不是配置错误,是系统资源瓶颈

因素 状态 影响
MIPI CSI 带宽 :white_check_mark: 独立 (CSI0+CSI2) 无瓶颈
VIN/ISP 处理 :white_check_mark: 并行 无瓶颈
VIO/VSE 缓冲池 :warning: 共享 ION 内存 关键瓶颈
VPU 编码输入 :warning: 共享 DDR 带宽 关键瓶颈
系统负载 :warning: 其他任务占用 加剧问题

关键信息

“编码输出码流本身不大…真正压力主要来自编码前的原始 NV12/YUV 帧”
“实际稳定性还取决于 ION buffer 大小、内部队列深度、DDR 占用和系统负载”


:white_check_mark: 必须执行的优化方案

:one: 升级系统版本(官方建议)

# 检查当前版本
cat /etc/version

# 官方建议升级至 v3.5.0+
# 历史版本有双目稳定性问题修复

:warning: 重要:Marcelo6151 明确指出"建议升级至 v3.5.0 有历史版本问题的修复 + 新的 sample 示例"

:two: 调大 ION/多媒体缓冲池

# 使用 srpi-config 调整(推荐方式)
sudo srpi-config

# 导航至:System Configuration → Memory → ION Heap Size
# 建议从 512MB 调至 768MB 或 1GB

或通过设备树修改(需重启):

# 编辑 boot 配置
sudo nano /boot/uEnv.txt
# 添加/修改:
ion_cma_size=768M

# 重启
sudo reboot

:three: 优化 VIO 队列深度

// 在 vio2encoder 源码中查找并修改
// 减少内部队列积压,但保持足够缓冲

// 关键参数(根据实际 SDK 版本)
vio_queue_depth = 4;      // 从默认 6-8 降至 4
buffer_count = 6;         // 保持 6,不要过大

:four: 关闭不必要的系统服务

# 停止可能占用 DDR 带宽的服务
# 如显示输出、AI 推理等

# 查看当前负载
rdkos_info
top

# 临时关闭桌面(如果使用)
sudo systemctl stop lightdm  # 或 gdm3

:five: 调整 VPU 编码参数

// 降低编码复杂度,减少 DDR 压力
// 在 sp_start_encoder 或相关配置中

encode_preset = "fast";     // 使用快速编码预设
encode_quality = "medium";  // 非最高质量
// 避免启用额外后处理(如降噪、锐化)

:test_tube: 诊断与验证步骤

步骤 1:检查系统版本

cat /etc/version
# 如果 < 3.5.0,建议升级

步骤 2:调整 ION 后测试

# 调整 ION 至 768MB 后重启
sudo reboot

# 重启后立即测试双目
python3 test_dual_1080p_30fps.py

步骤 3:监控关键指标

# 运行时新开终端监控
watch -n 1 'rdkos_info | grep -E "Memory|BPU|CPU"'

# 监控 VIO/VPU 错误
dmesg -w | grep -E "hb_mm_mc|vio|vpu|ion"

步骤 4:对比测试

配置 ION 大小 预期丢帧
当前 512MB ~30% (你现在的结果)
优化后 768MB+ < 5% (目标)
理想 1GB + v3.5.0 ~0%

:clipboard: 代码修改清单

// vio2encoder 源码修改点

// 1. 确认 video_index 正确
sp_open_camera_v2(vio_obj, 0, 0, ...);  // cam0
sp_open_camera_v2(vio_obj, 0, 2, ...);  // cam1

// 2. 保持 1080p@30fps
width[0] = 1920;
height[0] = 1080;
fps = 30;

// 3. 优化缓冲配置
buffer_count = 6;         // 不要过大
vio_queue_depth = 4;      // 新增:减少队列深度

// 4. 编码参数优化
encode_preset = "fast";   // 新增:快速编码

:bullseye: 最终建议

立即执行(优先级排序):

  1. 升级系统至 v3.5.0+ :star::star::star::star::star:

    • 官方明确说明有双目稳定性修复
  2. 调大 ION 至 768MB 或 1GB :star::star::star::star::star:

    • 使用 srpi-config 或修改 boot 配置
  3. 关闭非必要服务 :star::star::star:

    • 释放 DDR 带宽给摄像头
  4. 优化 VIO 队列深度 :star::star::star:

    • 减少内部积压
  5. 使用快速编码预设 :star::star:

    • 降低 VPU 负载

:red_question_mark: 需要你反馈

执行上述优化后:

  1. 系统版本是否已升级至 v3.5.0+?
  2. ION 大小调整到多少?
  3. 优化后双目 1080p@30fps 的丢帧率是多少?
  4. dmesg 中是否还有 hb_mm_mc_dequeue_input_buffer failed 错误?

如果完成所有优化后丢帧仍 >10%,可能需要:

  • 联系官方技术支持进一步分析底层驱动
  • 考虑更换带宽需求更低的传感器(如 IMX477 的高帧率模式)
  • 评估是否接受 1080p@25fps 作为折中方案

官方参考帖IMX219 双目采集丢帧问题