RDK x5运行vio2encoder示例丢帧问题

:police_car_light: 两个都丢帧 = 带宽/资源严重不足

既然 video_index=0/2 配置正确后cam0 也丢帧,说明问题核心是MIPI 带宽 + VPU 编码资源不足,不是配置问题。


:bar_chart: IMX219 带宽计算

分辨率 帧率 单路带宽 双目总带宽
1920×1080 30fps ~1.5Gbps ~3.0Gbps :warning:
1280×720 30fps ~0.7Gbps ~1.4Gbps :white_check_mark:
1280×720 20fps ~0.5Gbps ~1.0Gbps :white_check_mark:

RDK X5 MIPI CSI 带宽上限约 2-2.5Gbps,双路 1080p@30fps 已超限。


:white_check_mark: 立即解决方案

方案 1:降低分辨率(推荐优先)

// 修改 vio2encoder 配置
width[0] = 1280;   // 1920 → 1280
height[0] = 720;   // 1080 → 720
fps = 30;          // 保持 30fps 或降至 20

方案 2:降低帧率

// 如果必须保持 1080p
width[0] = 1920;
height[0] = 1080;
fps = 20;          // 30 → 20

方案 3:减少缓冲区数量

// 在 VIO 初始化配置中
buffer_count = 6;  // 默认可能是 10+,减少到 6

:test_tube: 快速验证(Python)

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

print("=== 测试 720p@20fps 双目稳定性 ===")

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

# 关键:720p + 20fps
ret0 = cam0.open_cam(0, 0, 20, 1280, 720)
ret2 = cam2.open_cam(0, 2, 20, 1280, 720)

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

if ret0 == 0 and ret2 == 0:
    drop0, drop2 = 0, 0
    start = time.time()
    
    for i in range(100):
        img0 = cam0.get_img(2, 1280, 720)
        img2 = cam2.get_img(2, 1280, 720)
        
        if not img0:
            drop0 += 1
            print(f"Frame {i}: cam0 DROP")
        if not img2:
            drop2 += 1
            print(f"Frame {i}: cam2 DROP")
        
        if img0 and img2 and i % 20 == 0:
            print(f"Frame {i}: OK")
        
        time.sleep(0.05)  # 20fps
    
    elapsed = time.time() - start
    print(f"\n=== 结果 ===")
    print(f"总帧数:100, 耗时:{elapsed:.2f}s")
    print(f"cam0 丢帧:{drop0}/100")
    print(f"cam2 丢帧:{drop2}/100")
    
    cam0.close_cam()
    cam2.close_cam()

:clipboard: 完整排查清单

# 1. 确认 video_index 配置正确
# pipe_id=0, video_index=0 (cam0)
# pipe_id=0, video_index=2 (cam1)

# 2. 运行 Python 测试 720p@20fps
python3 test_dual_720p.py

# 3. 如果 720p 稳定,再逐步提高参数
# 720p@20fps → 720p@30fps → 1080p@20fps → 1080p@30fps

# 4. 监控系统状态
rdkos_info  # 看 CPU/BPU 是否降频
top         # 看系统负载
dmesg -w | grep -E "hb_mm_mc|vio"  # 看缓冲区错误

# 5. 检查温度
cat /sys/class/thermal/thermal_zone*/temp

:bullseye: 推荐参数组合

场景 分辨率 帧率 预期稳定性
高稳定性 1280×720 20fps :white_check_mark: 几乎不丢帧
平衡 1280×720 30fps :white_check_mark: 少量丢帧
高分辨率 1920×1080 20fps :warning: 可能丢帧
极限 1920×1080 30fps :cross_mark: 严重丢帧

:red_question_mark: 需要你反馈

运行 720p@20fps 测试后告诉我:

  1. 丢帧数是多少?(应该接近 0)
  2. rdkos_info 输出中 CPU/BPU 频率是否正常?
  3. 修改 vio2encoder 后用 720p@20fps 是否还报错 -268435443

如果 720p@20fps 仍丢帧,可能需要检查:

  • 摄像头连接线是否松动
  • 供电是否稳定
  • SDK 版本是否需要升级

video_index=0/1的情况下cam0和cam1都有丢帧

:bullseye: 关键结论

video_index=0/1 是错误配置,根据你的 board_config.xml正确配置应该是 video_index=0/2

但即使配置正确,1080p@30fps 双目必然丢帧——这是带宽物理上限问题,不是配置问题。


:bar_chart: 问题根因确认

因素 你的配置 带宽需求 X5 上限 结果
分辨率 1920×1080 ~1.5Gbps/路 ~2.5Gbps 总 :cross_mark: 超限
帧率 30fps 双目 3.0Gbps MIPI CSI :cross_mark: 必丢帧
video_index 0/1 (错误) - - :cross_mark: 资源冲突
video_index 0/2 (正确) - - :white_check_mark: 配置正确

:white_check_mark: 必须做的两件事

:one: 修正 video_index 配置

// 错误配置(你现在的)
sp_open_camera_v2(obj, 0, 0, ...);  // cam0
sp_open_camera_v2(obj, 0, 1, ...);  // cam1 ← video_index=1 不存在!

// 正确配置(根据 board_config.xml)
sp_open_camera_v2(obj, 0, 0, ...);  // cam0 → mipi_host 0
sp_open_camera_v2(obj, 0, 2, ...);  // cam1 → mipi_host 2 ← 必须是 2!

:two: 降低分辨率/帧率(必须!)

// 推荐配置(稳定运行)
width = 1280;    // 1920 → 1280
height = 720;    // 1080 → 720
fps = 20;        // 30 → 20(先验证稳定)

:test_tube: 立即验证脚本

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

print("=== 正确配置测试:video_index=0/2 + 720p@20fps ===")

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

# 正确配置:video_index=0 和 2,720p@20fps
ret0 = cam0.open_cam(0, 0, 20, 1280, 720)
ret2 = cam2.open_cam(0, 2, 20, 1280, 720)

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

if ret0 == 0 and ret2 == 0:
    drop0, drop2, total = 0, 0, 100
    
    for i in range(total):
        img0 = cam0.get_img(2, 1280, 720)
        img2 = cam2.get_img(2, 1280, 720)
        
        if not img0:
            drop0 += 1
        if not img2:
            drop2 += 1
        
        if i % 20 == 0:
            print(f"Frame {i}: cam0={len(img0) if img0 else 0}B, cam2={len(img2) if img2 else 0}B")
        
        time.sleep(0.05)
    
    print(f"\n=== 结果 ===")
    print(f"cam0 丢帧:{drop0}/{total} ({drop0}%)")
    print(f"cam2 丢帧:{drop2}/{total} ({drop2}%)")
    
    if drop0 < 5 and drop2 < 5:
        print("✅ 配置稳定,可以应用到 vio2encoder")
    else:
        print("⚠️ 仍有丢帧,检查硬件连接或供电")
    
    cam0.close_cam()
    cam2.close_cam()
else:
    print("❌ 摄像头打开失败,检查 video_index 配置")

:memo: vio2encoder 修改清单

# 1. 找到源码中的摄像头初始化部分
cd /path/to/vio2encoder
grep -n "sp_open_camera" *.c *.cpp *.h

# 2. 修改 video_index 从 1 → 2
# 3. 修改分辨率从 1920x1080 → 1280x720
# 4. 修改帧率从 30 → 20

# 5. 重新编译
mkdir build && cd build
cmake ..
make -j4

# 6. 运行测试
./vio2encoder

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

:chart_increasing: 参数调整建议

目标 分辨率 帧率 video_index 预期丢帧
最稳定 1280×720 20fps 0/2 < 1%
平衡 1280×720 30fps 0/2 < 5%
高分辨率 1920×1080 15fps 0/2 < 10%
:cross_mark: 不推荐 1920×1080 30fps 0/2 > 30%

:red_question_mark: 最后确认

请运行上面的 Python 测试脚本,然后告诉我:

  1. video_index=0/2 是否能正常打开两个摄像头?
  2. 720p@20fps 测试的丢帧率是多少?
  3. 修改 vio2encoder 后错误码 -268435443 是否消失?

如果 720p@20fps 仍严重丢帧(>10%),可能是硬件问题(连接线/供电/摄像头模组)。

有没有RDKx5芯片数据流程图和原理图,数据经过CSI后怎么处理的,两路CSI是独立处理的吗

:bar_chart: RDK X5 MIPI CSI 数据流架构

官方未公开详细原理图,但根据社区案例和 SDK 架构,整理核心数据流如下:


:small_blue_diamond: 1. 硬件架构概览

[IMX219 左] → MIPI CSI0 (2-lane) → [VIN0] → [ISP0] → [VIO] → [VPU/GDC] → 内存/编码
[IMX219 右] → MIPI CSI2 (2-lane) → [VIN2] → [ISP2] → [VIO] → [VPU/GDC] → 内存/编码
                    ↑                      ↑
              独立 PHY 通道          独立处理流水线

关键点

  • CSI0 和 CSI2 是物理独立的(各有独立的 PHY、VIN、ISP 模块)
  • 带宽独立计算:每路约 1.5Gbps (1080p@30fps RAW10)
  • 共享资源:VIO 缓冲池、VPU 编码器、DDR 内存带宽

:small_blue_diamond: 2. 数据流详细路径

阶段 1: MIPI 接收 (PHY 层)

Camera Sensor 
   ↓ (MIPI CSI-2 差分信号)
MIPI D-PHY (CSI0/CSI2)
   ↓ (Lane 0 + Lane 1)
CSI Controller (J6/J5 内置)
   ↓ (RAW Data)
VIN (Video Input Node)

阶段 2: ISP 处理 (可选)

VIN → ISP (去噪、白平衡、色彩校正)
   ↓ (NV12/YUV/RAW)
VIO (Video Input/Output Module)

阶段 3: VIO 缓冲与分发

VIO Module
   ├──→ Buffer Queue (ION 内存)
   ├──→ sp_vio_get_frame() 应用层读取
   ├──→ VPU 编码器 (H.264/H.265)
   └──→ GDC (图像缩放/格式转换)

阶段 4: 编码/算法处理

VPU Encoder → H.264 码流 → 文件/网络
   或
BPU/CPU → AI 推理 (YOLO/VIO 等)

:small_blue_diamond: 3. 双路 CSI 是否独立?

模块 CSI0 CSI2 是否独立
MIPI PHY :white_check_mark: 独立 :white_check_mark: 独立 :white_check_mark:
VIN 节点 :white_check_mark: VIN0 :white_check_mark: VIN2 :white_check_mark:
ISP 流水线 :white_check_mark: ISP0 :white_check_mark: ISP2 :white_check_mark:
VIO 缓冲池 :warning: 共享 :warning: 共享 :cross_mark: 否 (关键瓶颈)
VPU 编码器 :warning: 共享 :warning: 共享 :cross_mark: 否 (资源竞争)
DDR 内存带宽 :warning: 共享 :warning: 共享 :cross_mark: 否 (主要瓶颈)

结论

  • 采集阶段独立:CSI0 和 CSI2 物理隔离,互不干扰
  • 后处理阶段共享:VIO 缓冲、VPU 编码、DDR 带宽是共享资源
  • 丢帧根因:1080p@30fps 双目 → DDR 带宽不足 + VIO 缓冲区溢出

:small_blue_diamond: 4. 带宽瓶颈分析

MIPI CSI 带宽 (独立)

单路 1080p@30fps RAW10:
  1920 × 1080 × 10bit × 30fps ≈ 622 Mbps (有效数据)
  + MIPI 协议开销 ≈ 1.5 Gbps (物理层)

双路总计:~3.0 Gbps
X5 MIPI CSI 总上限:~4-5 Gbps (理论值)
✅ MIPI 层带宽足够

DDR 内存带宽 (共享瓶颈)

双路 1080p@30fps NV12 写入:
  1920 × 1080 × 1.5 (NV12) × 30fps × 2路 ≈ 3.7 GB/s

X5 DDR 带宽:
  LPDDR4X 4266Mbps × 16bit ≈ 6.8 GB/s (理论)
  实际可用 ≈ 4-5 GB/s (扣除 CPU/BPU/其他外设)

⚠️ 剩余带宽不足 → 缓冲区积压 → 丢帧

:small_blue_diamond: 5. 你的问题定位

现象video_index=0/10/2 都丢帧
根因

  1. video_index=0/1 配置错误(mipi_host 1 不存在),导致资源分配异常
  2. 即使 video_index=0/2 正确,1080p@30fps 双目已触及 DDR 带宽上限
  3. VIO 缓冲区队列过深 → 旧帧未及时消费 → hb_mm_mc_dequeue_input_buffer failed

:white_check_mark: 最终解决方案

硬件层面 (无法改变)

  • CSI0/CSI2 物理独立 :white_check_mark:
  • DDR 带宽共享 :warning: 瓶颈

软件层面 (可优化)

// 1. 正确配置 video_index
sp_open_camera_v2(obj, 0, 0, ...);  // mipi_host 0
sp_open_camera_v2(obj, 0, 2, ...);  // mipi_host 2

// 2. 降低分辨率/帧率 (必须)
width = 1280, height = 720, fps = 20;  // 带宽降至 ~1.0 GB/s

// 3. 减少缓冲区深度
buffer_count = 6;  // 避免队列积压

// 4. 启用零拷贝 (如果支持)
// 减少 DDR 读写次数

:books: 相关资源


:bullseye: 下一步建议

  1. 先用 Python 验证 720p@20fps + video_index=0/2(预期丢帧<1%)
  2. 确认稳定后再移植到 vio2encoder
  3. 如需 1080p,尝试 15fps 或降低码率
  4. 监控 DDR 带宽rdkos_info 查看内存使用率

如果仍有问题,建议携带 dmesg 完整日志在社区新开一帖,@官方硬件团队 协助分析底层驱动配置。

v4l2-ctl --list-devices这个命令查不到MIPI CSI设备

:pushpin: 正常现象!RDK X5 的 MIPI 摄像头不走标准 V4L2 路径


:magnifying_glass_tilted_left: 为什么 v4l2-ctl 查不到?

RDK X5 摄像头架构差异

平台 MIPI 摄像头访问方式 /dev/video* 对应
树莓派/Jetson 标准 V4L2 /dev/video0, /dev/video1
RDK X5 hobot_vio / libsrcampy USB 摄像头才显示

你之前看到的 /dev/video0/1USB Webcam,不是 MIPI 摄像头:

Integrated Webcam: Integrated W (usb-xhci-hcd.2.auto-1.3)  ← USB 设备

:white_check_mark: 正确的 MIPI 摄像头查看方式

:one: 查看 dmesg 中的 MIPI 初始化信息

# 最可靠的方式
dmesg | grep -E "vin mipi|vin sensor" | grep -i "init"

你的输出显示:

[80395.640154] vin mipi0: init cmd: 0 real  → 摄像头 0 (CSI0)
[80395.723198] vin mipi2: init cmd: 0 real  → 摄像头 1 (CSI2)

:two: 查看 board_config.xml

cat /etc/board_config.xml | grep -A 20 "board_302"

你的配置显示:

"board_302": {
  "camera_num": 2,
  "cameras": [
    {"mipi_host": 0},   // 对应 video_index=0
    {"mipi_host": 2}    // 对应 video_index=2
  ]
}

:three: 使用 hobot_vio API 枚举

# Python 方式验证摄像头可用性
from hobot_vio import libsrcampy as srcampy

for host_id in [0, 1, 2, 3]:
    cam = srcampy.Camera()
    ret = cam.open_cam(0, host_id, 30, 1280, 720)
    print(f"mipi_host {host_id}: ret={ret}")
    if ret == 0:
        cam.close_cam()

:bar_chart: RDK X5 摄像头设备映射总结

摄像头类型 查看方式 设备节点 API
MIPI CSI dmesg | grep mipi /dev/video* libsrcampy.Camera()
USB UVC v4l2-ctl --list-devices /dev/video0/1... OpenCV VideoCapture

:bullseye: 回到你的丢帧问题

配置确认

// 正确配置(根据 board_config.xml)
sp_open_camera_v2(obj, 0, 0, ...);  // mipi_host 0 → CSI0
sp_open_camera_v2(obj, 0, 2, ...);  // mipi_host 2 → CSI2

丢帧根因:1080p@30fps 双目 → DDR 带宽不足

解决方案

// 先降参数验证稳定性
width = 1280;
height = 720;
fps = 20;

:test_tube: 快速验证脚本

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

print("=== MIPI 摄像头可用性测试 ===")
print("注意:MIPI 摄像头不会显示在 v4l2-ctl 中\n")

for host_id in [0, 2]:  # 根据 board_config.xml
    cam = srcampy.Camera()
    ret = cam.open_cam(0, host_id, 20, 1280, 720)
    print(f"mipi_host {host_id}: open_ret={ret}")
    
    if ret == 0:
        # 取 10 帧测试稳定性
        drop = 0
        for i in range(10):
            img = cam.get_img(2, 1280, 720)
            if not img:
                drop += 1
            time.sleep(0.05)
        print(f"  稳定性:{10-drop}/10 帧正常")
        cam.close_cam()
    else:
        print(f"  ❌ 打开失败")
    print()

:red_question_mark: 反馈

运行脚本后告诉我:

  1. mipi_host 0mipi_host 2 是否都能正常打开?
  2. 单路 720p@20fps 是否稳定(丢帧<1)?
  3. 双目同时运行 720p@20fps 丢帧率是多少?

确认这些后,就能确定是配置问题还是带宽硬件上限问题

root@ubuntu:/app/cdev_demo/step5_stability_test# sudo python3 test_cam.py
=== MIPI 摄像头可用性测试 ===
注意:MIPI 摄像头不会显示在 v4l2-ctl 中

2026/06/26 12:12:47.027 !INFO [OpenCamera][0450]hbn module
set camera fps: 20,width: -1,height: -1
Camera 0:
mipi_host: 0
Camera 1:
mipi_host: 2
Camera 2:
mipi_host: 0
Camera 3:
mipi_host: 0
mipi mclk is not configed.
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@0 i2c bus: 6 mipi rx phy: 0
WARN: Sensor Name: sc1330t, Expected Chip ID: 0xCA18, Actual Chip ID Read: 0x00
WARN: Sensor Name: irs2875-tof, Expected Chip ID: 0x2875, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc230ai-10fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc230ai-30fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc132gs-1280p, Expected Chip ID: 0x132, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs, Expected Chip ID: 0x5A, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5640, Expected Chip ID: 0x5640, Actual Chip ID Read: 0x00
WARN: Sensor Name: f37, Expected Chip ID: 0xF37, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx415-30fps-2lane, Expected Chip ID: 0x03, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx415-30fps-4lane, Expected Chip ID: 0x03, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc202cs-1600x1200, Expected Chip ID: 0xEB52, Actual Chip ID Read: 0x00
WARN: Sensor Name: irs2381c-tof, Expected Chip ID: 0x2381, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-640x480-60fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-1280x960-30fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-1920x1080-30fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-2592x1944-15fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-1280x960-120fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-1920x1080-50fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-2016x1520-40fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-4000x3000-10fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs-vc0, Expected Chip ID: 0x35, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs-vc1, Expected Chip ID: 0x35, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc231ai-30fps, Expected Chip ID: 0xCB6A, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx586-30fps-4lane, Expected Chip ID: 0x586, Actual Chip ID Read: 0x00
WARN: Sensor Name: os08c10-30fps-2lane, Expected Chip ID: 0x53, Actual Chip ID Read: 0x00
2026/06/26 12:12:47.156 ERROR [CamInitParam][0283]No camera sensor found, please check whether the camera connection or video_idx is correct.

2026/06/26 12:12:47.156 ERROR [OpenCamera][0498]CamInitParam failed error(-1)
mipi_host 0: open_ret=-1
? 打开失败

2026/06/26 12:12:47.157 !INFO [OpenCamera][0450]hbn module
set camera fps: 20,width: -1,height: -1
Camera 0:
mipi_host: 0
Camera 1:
mipi_host: 2
Camera 2:
mipi_host: 0
Camera 3:
mipi_host: 0
mipi mclk is not configed.
Searching camera sensor on device: /proc/device-tree/soc/cam/vcon@0 i2c bus: 6 mipi rx phy: 0
WARN: Sensor Name: sc1330t, Expected Chip ID: 0xCA18, Actual Chip ID Read: 0x00
WARN: Sensor Name: irs2875-tof, Expected Chip ID: 0x2875, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc230ai-10fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc230ai-30fps, Expected Chip ID: 0xCB34, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc132gs-1280p, Expected Chip ID: 0x132, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs, Expected Chip ID: 0x5A, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5640, Expected Chip ID: 0x5640, Actual Chip ID Read: 0x00
WARN: Sensor Name: f37, Expected Chip ID: 0xF37, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx415-30fps-2lane, Expected Chip ID: 0x03, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx415-30fps-4lane, Expected Chip ID: 0x03, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc202cs-1600x1200, Expected Chip ID: 0xEB52, Actual Chip ID Read: 0x00
WARN: Sensor Name: irs2381c-tof, Expected Chip ID: 0x2381, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-640x480-60fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-1280x960-30fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-1920x1080-30fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: ov5647-2592x1944-15fps, Expected Chip ID: 0x5647, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-1280x960-120fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-1920x1080-50fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-2016x1520-40fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx477-4000x3000-10fps, Expected Chip ID: 0x477, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs-vc0, Expected Chip ID: 0x35, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc035hgs-vc1, Expected Chip ID: 0x35, Actual Chip ID Read: 0x00
WARN: Sensor Name: sc231ai-30fps, Expected Chip ID: 0xCB6A, Actual Chip ID Read: 0x00
WARN: Sensor Name: imx586-30fps-4lane, Expected Chip ID: 0x586, Actual Chip ID Read: 0x00
WARN: Sensor Name: os08c10-30fps-2lane, Expected Chip ID: 0x53, Actual Chip ID Read: 0x00
2026/06/26 12:12:47.169 ERROR [CamInitParam][0283]No camera sensor found, please check whether the camera connection or video_idx is correct.

2026/06/26 12:12:47.169 ERROR [OpenCamera][0498]CamInitParam failed error(-1)
mipi_host 2: open_ret=-1
? 打开失败

root@ubuntu:/app/cdev_demo/step5_stability_test#

:police_car_light: 新问题:摄像头无法打开(之前能打开)

从日志看,不是带宽问题,是摄像头初始化失败!关键错误:

ERROR [CamInitParam][0283] No camera sensor found
WARN: ... Actual Chip ID Read: 0x00  ← 所有传感器 ID 都读不到!

这说明 I2C 通信失败,摄像头传感器无法被识别。


:magnifying_glass_tilted_left: 为什么之前能打开现在打不开?

可能原因

原因 说明 概率
摄像头被占用 之前的 vio2encoder 进程没退出 :star::star::star:
测试脚本参数错误 width=-1, height=-1 导致初始化失败 :star::star:
I2C 总线配置变化 设备树/驱动配置被修改 :star:
硬件连接松动 摄像头排线接触不良 :star:

:white_check_mark: 立即排查步骤

:one: 检查是否有进程占用摄像头

# 查看是否有进程正在使用 VIO/摄像头
ps aux | grep -E "vio|camera|mipi"
lsof /dev/video*

# 如果有,杀掉进程
killall vio2encoder
killall -9 python3

:two: 修正测试脚本(不要传 -1)

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

print("=== MIPI 摄像头测试(修正版)===\n")

# IMX219 必须指定正确分辨率,不能传 -1
test_configs = [
    {"pipe_id": 0, "video_index": 0, "fps": 20, "width": 1280, "height": 720},
    {"pipe_id": 0, "video_index": 2, "fps": 20, "width": 1280, "height": 720},
]

for cfg in test_configs:
    cam = srcampy.Camera()
    ret = cam.open_cam(
        cfg["pipe_id"], 
        cfg["video_index"], 
        cfg["fps"], 
        cfg["width"], 
        cfg["height"]
    )
    print(f"pipe_id={cfg['pipe_id']}, video_index={cfg['video_index']}: ret={ret}")
    
    if ret == 0:
        # 取 5 帧测试
        for i in range(5):
            img = cam.get_img(2, cfg["width"], cfg["height"])
            if img:
                print(f"  Frame {i}: {len(img)} bytes ✓")
            else:
                print(f"  Frame {i}: DROP ✗")
            time.sleep(0.05)
        cam.close_cam()
        print(f"  ✓ 测试通过\n")
    else:
        print(f"  ✗ 打开失败\n")

:three: 检查 I2C 总线上的摄像头

# 查看 I2C 设备(IMX219 地址通常是 0x10)
i2cdetect -y 6  # 根据日志,你的摄像头在 i2c-6

# 应该能看到类似:
#      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
# 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
# 10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

:four: 查看摄像头驱动加载状态

# 查看摄像头相关内核模块
lsmod | grep -E "hobot|sensor|mipi"

# 查看 dmesg 中的摄像头初始化
dmesg | grep -E "imx219|sensor|mipi" | tail -30

:clipboard: 关键信息收集

请运行以下命令并提供输出:

# 1. 系统版本
cat /etc/version

# 2. 当前运行的摄像头相关进程
ps aux | grep -E "vio|camera|mipi|encoder" | grep -v grep

# 3. I2C 设备扫描
i2cdetect -y 6

# 4. 摄像头初始化日志
dmesg | grep -E "vin mipi|camera_init" | tail -20

# 5. board_config.xml 内容
cat /etc/board_config.xml | grep -A 30 "board_302"

:bullseye: 临时解决方案

如果急需测试,先重启板子清除可能的资源占用:

# 重启后直接测试
sudo reboot

# 重启后立即运行测试(不要先运行 vio2encoder)
python3 test_cam_fixed.py

:red_question_mark: 需要你反馈

  1. 重启后运行修正版测试脚本,video_index=02 是否能打开?
  2. i2cdetect -y 6 是否能看到 IMX219 的设备地址(0x10)?
  3. 之前运行的 vio2encoder 进程是否正常退出?

如果重启后仍打不开,可能是设备树配置问题硬件连接问题,需要进一步排查。

记录.txt (70.3 KB)

:police_car_light: 新问题:I2C 通信失败 + MCLK 未配置

从你上传的日志看,摄像头初始化完全失败,不是丢帧问题了。关键错误:

ERROR [CamInitParam][0283] No camera sensor found
WARN: ... Actual Chip ID Read: 0x00  ← 所有传感器 ID 都读到 0!
mipi mclk is not configed.  ← MCLK 主时钟未配置

:magnifying_glass_tilted_left: 根因分析

现象 含义 可能原因
Chip ID Read: 0x00 I2C 读取失败 I2C 总线错误/地址错误/硬件未连接
mipi mclk is not configed 传感器主时钟未启用 设备树配置缺失
i2c bus: 6 正在扫描 I2C-6 摄像头可能不在 I2C-6 上

:white_check_mark: 立即排查步骤

:one: 检查 I2C 总线上是否有 IMX219

# 扫描 I2C-6(日志显示的总线)
sudo i2cdetect -y 6

# 如果 I2C-6 没有,尝试其他总线(IMX219 通常在 0x10)
sudo i2cdetect -y 7
sudo i2cdetect -y 8

预期结果:应该能在某个总线上看到 10(IMX219 的 I2C 地址)

:two: 检查设备树中 MCLK 配置

# 查看摄像头设备树配置
cat /proc/device-tree/soc/cam/vcon@0/status
cat /proc/device-tree/soc/cam/vcon@2/status

# 查看 MCLK 配置
dtc -I fs /proc/device-tree > full_dts.txt
grep -A 20 -B 5 "imx219\|mclk\|clock" full_dts.txt | head -50

:three: 检查摄像头物理连接

# 确认摄像头排线是否插紧
# X5 的 MIPI 接口:
#   CSI0 → J701 (通常)
#   CSI2 → J703 (通常)

# 查看内核中摄像头初始化日志
dmesg | grep -E "imx219|sensor|mipi" | tail -30

:four: 检查 board_config.xml 与实际硬件匹配

# 确认你的板子型号
cat /proc/device-tree/board-id 2>/dev/null || echo "Board ID not found"

# 查看当前使用的 board_config
cat /etc/board_config.xml | grep -A 10 "board_302"

:wrench: 可能的解决方案

方案 A:设备树配置问题

如果 i2cdetect 扫不到 IMX219,可能需要:

# 1. 检查是否有 imx219 的设备树 overlay
ls /boot/overlays/ | grep -i imx

# 2. 查看 /boot/uEnv.txt 或 /boot/extlinux/extlinux.conf 中的 overlay 配置
cat /boot/uEnv.txt | grep -i overlay

# 3. 如需启用 imx219,添加类似配置(根据实际 SDK 版本)
# fdtoverlays=imx219-csi0.imx219-csi2.dtbo

方案 B:MCLK 时钟未启用

日志中 mipi mclk is not configed 表明传感器时钟未配置:

# 检查时钟配置
cat /proc/device-tree/soc/cam/*/mclk* 2>/dev/null

# 可能需要修改设备树添加:
# mclk-hz = <24000000>;
# mclk-gpio = <&gpio X Y>;

方案 C:摄像头驱动未加载

# 查看摄像头相关内核模块
lsmod | grep -E "sensor|mipi|imx"

# 查看是否有 imx219 驱动
find /lib/modules/$(uname -r) -name "*imx219*"

:clipboard: 请运行以下诊断命令并反馈

# 1. I2C 扫描结果
sudo i2cdetect -y 6
sudo i2cdetect -y 7

# 2. 摄像头初始化日志
dmesg | grep -E "imx219|sensor|mipi|camera_init" | tail -40

# 3. 板子型号
cat /etc/version
rdkos_info | grep -E "Hardware|Board"

# 4. 设备树中摄像头节点
ls -la /proc/device-tree/soc/cam/

# 5. 当前运行的摄像头进程
ps aux | grep -E "vio|camera|mipi" | grep -v grep

:bullseye: 临时建议

  1. 重启板子:清除可能的资源占用

    sudo reboot
    
  2. 重启后立即测试(不要先运行 vio2encoder):

    # 重启后直接运行 I2C 扫描
    sudo i2cdetect -y 6
    
  3. 如果之前能打开现在打不开

    • 检查摄像头排线是否松动
    • 确认供电是否稳定(IMX219 需要 2.8V/1.8V)
    • 检查是否有其他进程占用摄像头

:red_question_mark: 需要你反馈

请运行上面的诊断命令,告诉我:

  1. i2cdetect -y 6/7 是否能看到 10(IMX219 地址)?
  2. dmesg 中摄像头初始化日志的完整输出?
  3. 板子型号系统版本
  4. 摄像头是官方套件还是第三方?连接的是哪个 MIPI 接口?

如果 I2C 扫不到设备,大概率是设备树配置硬件连接问题,需要进一步排查。