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 双目采集丢帧问题