RDK x5运行vio2encoder示例丢帧问题

:bullseye: 最终解决方案:双目 1080p@30fps 优化

你已升级到 v3.5.0(官方推荐版本),现在按以下步骤系统级优化:


:white_check_mark: 必须执行的优化项

:one: 调大 ION 内存(最关键)

你当前 ION=512MB,官方建议双目 1080p 需 768MB 或 1GB

# 方法 A:使用 srpi-config(推荐)
sudo srpi-config
# 导航:System Configuration → Memory → ION Heap Size
# 调整为:768MB 或 1024MB

# 方法 B:修改 boot 配置
sudo nano /boot/uEnv.txt
# 添加或修改:
ion_cma_size=768M

# 重启生效
sudo reboot

:two: 优化 VIO 队列深度

在 vio2encoder 源码中查找并修改:

// 查找类似配置(根据 SDK 版本可能不同)
// 位置:vio2encoder.c 或配置文件

// 修改前(默认值)
buffer_count = 8;
queue_depth = 6;

// 修改后(减少积压)
buffer_count = 6;      // 够用即可
queue_depth = 4;       // 关键:减少内部队列

:three: 关闭非必要服务(释放 DDR 带宽)

# 停止桌面环境(如果不用 GUI)
sudo systemctl stop lightdm
# 或
sudo systemctl stop gdm3

# 停止其他占用 DDR 的服务
sudo systemctl stop bluetooth
sudo systemctl stop wpa_supplicant

# 查看当前内存占用
rdkos_info | grep -i memory

:four: 优化 VPU 编码参数

// 在 sp_start_encoder 或编码配置中
// 使用快速编码预设,减少 DDR 压力

encode_preset = "fast";       // 快速编码
encode_quality = "medium";    // 非最高质量
gop_size = 30;                // 关键帧间隔
// 避免启用额外后处理

:test_tube: 验证脚本

#!/usr/bin/env python3
from hobot_vio import libsrcampy as srcampy
import time

print("=== 双目 1080p@30fps 稳定性测试 ===\n")

cam0 = srcampy.Camera()
cam2 = srcampy.Camera()

# 目标参数:1080p@30fps
ret0 = cam0.open_cam(0, 0, 30, 1920, 1080)
ret2 = cam2.open_cam(0, 2, 30, 1920, 1080)

print(f"Open: cam0={ret0}, cam2={ret2}\n")

if ret0 == 0 and ret2 == 0:
    drop0, drop2 = 0, 0
    start = time.time()
    
    for i in range(100):
        img0 = cam0.get_img(2, 1920, 1080)
        img2 = cam2.get_img(2, 1920, 1080)
        
        if not img0:
            drop0 += 1
            print(f"Frame {i}: cam0 DROP")
        if not img2:
            drop2 += 1
            print(f"Frame {i}: cam2 DROP")
        
        time.sleep(0.033)  # 30fps
    
    elapsed = time.time() - start
    print(f"\n=== 结果 (1080p@30fps) ===")
    print(f"耗时:{elapsed:.2f}s, 目标:3.3s")
    print(f"cam0 丢帧:{drop0}/100 ({drop0}%)")
    print(f"cam2 丢帧:{drop2}/100 ({drop2}%)")
    
    if drop0 < 5 and drop2 < 5:
        print("✅ 优化成功!")
    elif drop0 < 15 and drop2 < 15:
        print("⚠️ 可接受范围,继续优化")
    else:
        print("❌ 仍需进一步优化")
    
    cam0.close_cam()
    cam2.close_cam()
else:
    print("❌ 摄像头打开失败")

:bar_chart: 优化前后对比预期

配置项 优化前 优化后 预期改善
系统版本 3.5.0 ✓ 3.5.0 ✓ 已有修复
ION 大小 512MB 768MB+ 丢帧↓50%
buffer_count 8+ 6 延迟↓
queue_depth 6+ 4 积压↓
系统服务 全开 精简 DDR 带宽↑
预期丢帧 ~30% <10% :white_check_mark: 目标

:magnifying_glass_tilted_left: 运行时监控

# 新开终端监控关键指标
watch -n 1 'rdkos_info | grep -E "Memory|BPU|CPU"'

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

# 查看 ION 使用情况
cat /sys/kernel/debug/ion/clients 2>/dev/null

:bullseye: 执行顺序

# 1. 调大 ION 至 768MB
sudo srpi-config  # 或修改 /boot/uEnv.txt

# 2. 重启
sudo reboot

# 3. 关闭非必要服务
sudo systemctl stop lightdm

# 4. 修改 vio2encoder 源码(buffer_count=6, queue_depth=4)

# 5. 重新编译
cd /path/to/vio2encoder
mkdir -p build && cd build
cmake ..
make -j4

# 6. 运行测试
./vio2encoder

# 7. 监控日志
dmesg -w | grep -E "hb_mm_mc"

:red_question_mark: 需要你反馈

完成优化后告诉我:

  1. ION 大小调整到多少?
  2. 双目 1080p@30fps 的丢帧率是多少?
  3. dmesghb_mm_mc_dequeue_input_buffer failed 错误是否减少?
  4. rdkos_info 显示的剩余 ION 内存是多少?

如果完成所有优化后丢帧仍 >15%,建议:

  • 在社区新开一帖 @官方技术支持 进一步分析
  • 考虑 1080p@25fps 作为折中方案(带宽降 17%)
  • 评估更换传感器(如 IMX477 的高帧率模式)

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

还没有升级,是让你看下是否必须升级最新版本,这个版本是指什么版本,RDKx5内核版本?

:clipboard: 版本说明与升级建议

"版本"指的是什么?

RDK OS 系统版本(不是内核版本),通过以下命令查看:

cat /etc/version

你当前是 3.3.1,最新是 3.5.0


:bullseye: 是否必须升级?

结论:建议升级,但不是绝对必须

版本 双目相关修复 建议
3.3.1 (你当前) :cross_mark: 无专门修复 基准版本
3.4.1 :white_check_mark: “媒体链路大规模修复:涵盖 ISP、VIO、编码/解码等模块的稳定性增强” :star: 推荐
3.5.0 :white_check_mark: “同步 SDK 最新版本 + 多媒体示例修复” :star::star: 最推荐

Marcelo6151 官方建议

“建议升级至 v3.5.0 有历史版本问题的修复 + 新的 sample 示例,并且基于此版本发现的问题才会在下个版本修复”


:white_check_mark: 升级优先级建议

方案 A:先不升级,尝试其他优化(快速)

# 1. 调大 ION 内存(最关键)
sudo srpi-config
# System Configuration → Memory → ION Heap Size → 768MB

# 2. 重启
sudo reboot

# 3. 测试双目 1080p@30fps
python3 test_dual_1080p.py

# 4. 如果丢帧<10%,可以不升级

方案 B:升级到 3.4.1 或 3.5.0(彻底)

# 升级命令
sudo apt update
sudo apt upgrade

# 或从社区下载镜像重新烧录
# https://developer.d-robotics.cc/

3.4.1 关键修复(与你问题直接相关):

  • :white_check_mark: 媒体链路大规模修复(ISP、VIO、编码/解码)
  • :white_check_mark: 示例程序全面清理与补齐
  • :white_check_mark: 同步 X5 SDK 1.1.1(之前是 1.0.17)

:bar_chart: 决策建议

你的情况 建议
项目紧急,不能重烧系统 先调 ION + 优化 buffer,不升级
可以接受重装系统 直接升到 3.4.1 或 3.5.0
调 ION 后丢帧仍>15% 必须升级

:bullseye: 推荐执行顺序

# 第 1 步:先调 ION(5 分钟,无需升级)
sudo srpi-config → ION 768MB → reboot

# 第 2 步:测试双目 1080p@30fps
# 如果丢帧<10% → 可以不升级
# 如果丢帧>15% → 继续第 3 步

# 第 3 步:升级到 3.4.1 或 3.5.0
sudo apt update && sudo apt upgrade

# 第 4 步:再次测试

:red_question_mark: 确认你当前的版本

请运行:

cat /etc/version

告诉我输出是什么,我帮你判断:

  1. 是否值得升级
  2. 升级到哪个版本(3.4.1 还是 3.5.0)
  3. 升级的具体步骤

总结:ION 调大是必须做的,系统升级是建议做的(有媒体链路修复,但不是唯一解决方案)。