06 视频输入应用
本章节介绍 GK7206 的视频输入(Video Input,VI)应用示例 —— sample_vio。该应用演示了 VI/VPSS 的各种工作模式,包括在线/离线模式、单/双 sensor、WDR、LDC、AHD 等高级功能。
应用源码位于 SDK 目录 sample/vio/,是开发视频采集相关应用的参考模板。
1 应用概述
1.1 功能特性
- 多种工作模式:在线/离线、单/双 sensor、WDR、LDC、AHD 等
- 双输出路径:VO 输出(显示)或 VENC 输出(编码)
- 灵活配置:支持多种分辨率组合和功能组合
- 内存高效:支持轻量级模式,适合 26 MB 内存环境
1.2 技术参数
| 参数 | 值 |
|---|---|
工作模式 | 0~11(见下表) |
输出模式 | 0=VO 输出,1=VENC 输出 |
分辨率 | 根据 Sensor 配置 |
帧率 | 由 Sensor 决定 |
内存占用 | 较高(重负载模式易 OOM) |
1.3 工作模式列表
| work_mode | 含义 | 指令示例 |
|---|---|---|
| 0 | vi online vpss online | ./sample_vio 0 |
| 1 | vi offline vpss online(4K 用) | ./sample_vio 1 |
| 2 | vi offline vpss offline | ./sample_vio 2 |
| 3 | online/offline + WDR | ./sample_vio 3 |
| 4 | offline 切换 linear/WDR | ./sample_vio 4 |
| 5 | offline 切换分辨率 | ./sample_vio 5 |
| 6 | 双 sensor | ./sample_vio 6 |
| 7 | 双 sensor 拼接 | ./sample_vio 7 |
| 10 | offline online LDC | ./sample_vio 10 |
| 11 | ahd mipi | ./sample_vio 11 |
1.4 目录结构
sample/vio/
├── Makefile # 构建脚本
└── sample_vio.c # 主程序2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- Sensor 已连接:需连接 SC465SL 或兼容的图像传感器
2.2 编译应用
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 vio 示例
make -C vio clean && make -C vio2.3 部署到板端
# 挂载 SD 卡(推荐)
mkdir -p /sd_card
mount -t vfat /dev/mmcblk1p1 /sd_card
# 使用 SCP 传输到开发板
scp sample/vio/sample_vio root@<板端IP>:/sd_card/注意
重负载模式(如双 sensor、4K)容易 OOM,建议挂载 SD 卡后运行。
2.4 运行应用
# 添加执行权限
chmod +x /sd_card/sample_vio
# 进入 SD 卡目录
cd /sd_card
# 运行(work_mode 0,stream_mode 1)
./sample_vio 0 1
# 或 VENC 输出(可拉 RTSP 流)
./sample_vio 0 1
# 或 VO 输出(需显示设备)
./sample_vio 0 02.5 预期输出
成功运行后(stream_mode=1),终端会输出类似以下信息:
sample_vio running
work_mode: 0
stream_mode: 1
...
rtsp://192.168.1.100:554/livestream/0
...3 内部执行逻辑详解
3.1 应用架构
本应用采用以下架构:
Sensor → VI → VPSS → VO/VENC3.2 在线模式 vs 离线模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 在线模式 | VI 直接输出到 VPSS,无需内存拷贝 | 实时性要求高 |
| 离线模式 | VI 写入内存,VPSS 从内存读取 | 需要缓存或后处理 |
3.3 VI/VPSS 初始化流程
// 步骤 1:系统初始化
sample_comm_sys_init(&sys_config);
// 步骤 2:ISP 初始化
sample_comm_isp_init();
// 步骤 3:VI 启动
sample_comm_vi_start(...);
// 步骤 4:VPSS 启动
sample_comm_vpss_start(...);
// 步骤 5:根据 stream_mode 选择输出
if (stream_mode == 0) {
// VO 输出
sample_comm_vo_start(...);
xmedia_bind_vpss_to_vo(...);
} else {
// VENC 输出
sample_comm_venc_start(...);
xmedia_bind_vpss_to_venc(...);
}4 关键编程要点
4.1 工作模式配置
switch(work_mode) {
case 0: // vi online vpss online
sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode = XMEDIA_WORK_MODE_ONLINE;
sys_config.sys_conf.pipe_mode[0].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
break;
case 1: // vi offline vpss online
sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[0].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
break;
// ... 其他模式
}4.2 双 Sensor 配置
// 配置两个 sensor
sys_config.sensor_num = 2;
sys_config.sensor_type[0] = SENSOR0_TYPE;
sys_config.sensor_type[1] = SENSOR1_TYPE;5 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
Killed(OOM) | 26 MB 跑重负载模式 | 挂载 SD 卡,使用轻量级模式 |
sample_comm_vi_init failed! | Sensor 初始化失败 | 检查 sensor 连接和配置 |
open vo err | 无显示设备 | 使用 stream_mode=1 或接显示设备 |
