本章节介绍 GK7206 的视频图形子系统(Video Graphics Subsystem,VGS)应用示例 —— sample_vgs。该应用演示了 VGS 的各种图形处理功能,包括 cover(遮挡)、OSD(字符叠加)、luma(亮度调整)、scale(缩放)、rotate(旋转)等。
应用源码位于 SDK 目录 sample/vgs/,是开发视频图形处理相关应用的参考模板。
| 参数 | 值 |
|---|---|
功能索引 |
0=cover+osd+luma+scale,1=rotate |
依赖 |
sensor + VPSS |
输出 |
RTSP 流或 VO 显示 |
| index | 名称 | 指令 | 预期现象 |
|---|---|---|---|
| 0 | cover+osd+luma+scale | ./sample_vgs 0 |
叠加 cover/osd、调亮、缩放,RTSP 可见 |
| 1 | rotate | ./sample_vgs 1 |
画面旋转 |
sample/vgs/
├── Makefile # 构建脚本
└── sample_vgs.c # 主程序
在编译本应用之前,请确保已完成以下准备工作:
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 vgs 示例
make -C vgs clean && make -C vgs
# 挂载 SD 卡(推荐)
mkdir -p /sd_card
mount -t vfat /dev/mmcblk1p1 /sd_card
# 使用 SCP 传输到开发板
scp sample/vgs/sample_vgs root@<板端IP>:/sd_card/
# 添加执行权限
chmod +x /sd_card/sample_vgs
# 进入 SD 卡目录
cd /sd_card
# 运行(index 0:cover+osd+luma+scale)
./sample_vgs 0
# 或(index 1:rotate)
./sample_vgs 1
成功运行后,终端会输出类似以下信息:
sample_vgs running
vgs test index: 0
...
rtsp://192.168.1.100:554/livestream/0
拉流后可以看到:
本应用采用以下架构:
Sensor → VI → VPSS → VGS → VENC → RTSP 推流
// 步骤 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:VGS 初始化
xmedia_vgs_init();
// 步骤 6:配置 VGS 任务
xmedia_vgs_handle_t vgs_handle = xmedia_vgs_begin_job(...);
// 添加 cover 任务
xmedia_vgs_add_cover_task(vgs_handle, &cover_attr);
// 添加 OSD 任务
xmedia_vgs_add_osd_task(vgs_handle, &osd_attr);
// 添加 luma 任务
xmedia_vgs_add_luma_task(vgs_handle, &luma_attr);
// 提交任务
xmedia_vgs_end_job(vgs_handle);
// 步骤 7:VENC 启动
sample_comm_venc_start(...);
// 步骤 8:绑定模块
xmedia_bind_vpss_to_vgs(...);
xmedia_bind_vgs_to_venc(...);
xmedia_vgs_cover_attr_t cover_attr;
cover_attr.enable = XMEDIA_TRUE;
cover_attr.rect.x = 100;
cover_attr.rect.y = 100;
cover_attr.rect.width = 200;
cover_attr.rect.height = 200;
cover_attr.color = 0xFF0000; // 红色
xmedia_vgs_osd_attr_t osd_attr;
osd_attr.enable = XMEDIA_TRUE;
osd_attr.rect.x = 10;
osd_attr.rect.y = 10;
osd_attr.rect.width = 200;
osd_attr.rect.height = 30;
osd_attr.font_color = 0xFFFFFF; // 白色
osd_attr.bg_color = 0x000000; // 黑色
strcpy(osd_attr.text, "Hello VGS");
xmedia_vgs_luma_attr_t luma_attr;
luma_attr.enable = XMEDIA_TRUE;
luma_attr.luma_factor = 120; // 100=正常,>100=变亮,<100=变暗
xmedia_vgs_scale_attr_t scale_attr;
scale_attr.enable = XMEDIA_TRUE;
scale_attr.dst_width = 640;
scale_attr.dst_height = 480;
xmedia_vgs_rotate_attr_t rotate_attr;
rotate_attr.enable = XMEDIA_TRUE;
rotate_attr.rotate = VGS_ROTATE_90; // 90/180/270 度
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| OSD 不显示 | OSD 配置错误 | 检查 OSD 位置和颜色设置 |
| Cover 区域错误 | Cover 坐标超出画面 | 检查 Cover 坐标是否在有效范围内 |
| 画面过亮或过暗 | Luma 值设置不当 | 调整 Luma 值到 100 左右 |
| 缩放变形 | 宽高比不一致 | 保持目标宽高比与源一致 |