NVR Demo 使用说明¶
1. 功能场景介绍¶
1.1 程序概述¶
sgs_demo_nvr是用于展示NVR(Network Video Recorder,网络视频录像机)功能的示例程序。该程序支持多路视频解码、显示、录制、抓图等功能,并提供丰富的测试用例。
1.2 主要特性¶
- 多通道视频解码与显示
- 实时视频抓图与录制
- 画面切换与分辨率调整
- PIP(画中画)功能
- 缩放(ZOOM)与EPTZ(电子云台)
- 鼠标显示与移动
- UI图层叠加
- 双层UI融合
- Alpha混合与Color Key
- FB缩放
- 同源/异源切换
- 静帧功能
1.3 模块架构¶
1.3.1 数据流¶
主case pipeline:
使用rotate时需要用到SCL:
+---------+ +---------+ +---------+
| VDEC | ---> | SCL | ---> | DISP |
+---------+ +---------+ +---------+
framebase framebase
1.3.2 程序架构¶
sgs_demo_nvr架构
├── 视频解码模块 (VDEC)
│ ├── H.264/H.265解码
│ ├── 通道管理
│ └── 码流发送
├── 显示模块 (DISP)
│ ├── 视频输出接口 (HDMI/VGA/MIPI/TTL/BT1120)
│ ├── 分辨率支持 (720P/1080P/4K等)
│ └── 画面布局管理
├── 图形引擎模块 (GFX)
│ ├── 缩放与旋转
│ ├── Alpha混合
│ ├── Color Key
│ └── Quick Fill
├── 帧缓冲模块 (FB)
│ ├── UI图层显示
│ ├── 双层UI融合
│ └── 鼠标图标显示
├── 缩放模块 (SCL)
│ ├── 画面缩放
│ └── EPTZ支持
├── 虚拟显示模块 (VDISP)
│ ├── 软件拼图
│ └── 多路合成
└── 编码模块 (VENC)
├── 抓图编码
└── 零通道编码 (WBC)
1.4 测试用例说明¶
| case id | 说明 |
|---|---|
| 0 | exit,退出程序 |
| 1 | 手动切屏 |
| 2 | 自动循环随机切屏,5s切换一次 |
| 3 | 手动切换分辨率 |
| 4 | 自动循环随机切换分辨率,5s切换一次 |
| 5 | 全屏画面显示PIP,vdec_0_0_0->scl_1_0_0->disp_0_64_0 |
| 6 | DISP zoom功能 |
| 7 | 抓图,vdec_0_0_1->venc_8_0_0,如果需要放大:vdec_0_0_1->scl_1_0_0->venc_8_0_0 |
| 8 | 静帧功能,VDEC暂停通道解码 |
| 9 | VDISP Case,vdec->scl->vdisp->disp |
| 10 | 获取所有VDEC通道状态 |
| 11 | 设定HDMI输出设备参数,Csc:色彩转换信息(包含Contrast:对比度,Luma:亮度,Hue:色度,Saturation:饱和度),Gain:信号强度增益,Sharpness:锐利度 |
| 12 | 鼠标显示和移动 |
| 13 | 设置VDEC送帧间隔时间,单位:ms |
| 14 | 设置alpha值,范围:0~ff,支持global与pixel,可以通过配置文件中fbArgs_x中alphaType参数设置,0: global; 1: pixel |
| 15 | 读取指定的UI文件数据经过GFX操作再送到framebuffer显示,GFX操作包括:1、缩放 2、旋转(0°,90°,180°,270°) 3、mirror 4、alpha blend |
| 16 | 读取一张YUV420SP数据经过GFX旋转(0°,90°,180°,270°)操作后再保存到文件中 |
| 17 | 读指定UI文件数据到framebuffer |
| 18 | scl stretch |
| 19 | 预留 |
| 20 | GFX quickfill到framebuff,包括drawrect到framebuffer和colorkey设置 |
| 21 | FB放大,将1920x1080放大4K显示 |
| 22 | 同源<->异源切换,支持hdmi&vga、hdmi&ttl、hdmi&mipi、hdmi&bt1120切换 |
| 23 | 零通道编码,wbc->venc->file |
| 24 | EPTZ Case,1路Pano(vdec->disp) + 5路eptz(vdec->scl->disp) |
| 25 | 设置colorkey值,值为argb8888格式,例如:ff00ff00 |
| 26 | 双层UI融合显示Case |
2. 编译环境说明¶
2.1 编译环境设置¶
在项目根目录下设置 arm64 编译环境:
export PATH=/tools/toolchain/aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-unknown-linux-gnu-12.4.0-
export ARCH=arm64
cd project
make linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig
如果选用2GB的ddr,defconfig可以使用 linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.2048.fccsp16_lpddr4x_defconfig
2.2 编译命令¶
# 编译整个 project
cd project
make clean;make image -j16
# 编译 NVR demo
cd sdk/verify/sample_code
make demo/nvr/nvr
2.3 编译产物¶
编译生成的可执行文件位于:sdk/verify/sample_code/out/arm64/app/sgs_demo_nvr
3. 运行环境说明¶
3.1 硬件环境¶
- Comake Pi D3开发板
- 电源、网线、串口线
- 鼠标
- HDMI线与4K显示屏
- MIPI PANEL
┌─────────┐ ┌────────────────┐ ┌──────────┐ │ 显示器A │◄─────────────────►│ 开发板/EVB板 │◄─────────────────►│ 显示器B │ └─────────┘ HDMI直连 └────────────────┘ MIPI PANEL └──────────┘ │ │ 串口/网络 | ▼ ┌────────────┐ │ PC端 │ └────────────┘
详细硬件连接如下所示

3.2 DTS配置¶
无特殊要求
3.3 配置文件说明¶
配置文件config_nvr.json中主要包含:disp、fb、vdec 3个模块的参数设置。
3.3.1 DISP参数¶
| 参数 | 说明 |
|---|---|
dispDevNum |
disp 设备个数,最大为2 |
dispArgs_0 |
disp0 的参数配置 |
dispArgs_1 |
disp1 的参数配置 |
dispArgs_x参数说明:
| 参数 | 说明 |
|---|---|
intfType |
视频输出接口,支持 hdmi、vga、mipi、ttl、bt1120,如果为双屏同源显示支持 hdmi&vga、hdmi&ttl、hdmi&bt1120,D3 开发板上只支持异源 hdmi&mipi的组合 |
timing |
支持的时序,720P_50, 720P_60, 1080P_50, 1080P_60, 1600x1200_60, 1440x900_60, 1280x1024_60, 1024x768_60, 1280x800_60, 1366x768_60, 2560x1440_30, 2560x1600_60, 3840x2160_30 |
chnNum |
画面数量,disp0:164,disp1:132 |
rotate |
旋转角度,0:0°, 1:90°, 2:180°, 3:270°, 4:NO ROTAT |
3.3.2 FB参数¶
| 参数 | 说明 |
|---|---|
fbUiMix |
fb 双层UI融合测试,1:打开,0:关闭 |
fbDevNum |
fb 设备个数,最大为2 |
fbArgs_0 |
fb0 的参数配置 |
fbArgs_1 |
fb1 的参数配置 |
fbArgs_x参数说明:
| 参数 | 说明 |
|---|---|
alphaType |
alpha值类型,0:global; 1:pixel |
mouseIconFilePath |
鼠标图标文件路径,如:./cursor-arrow.dat |
mousePicWidth |
鼠标图标文件的宽 |
mousePicHeight |
鼠标图标文件的高 |
gfxFilePath |
UI文件路径,argb1555格式 |
gfxPicWidth |
UI文件的宽,argb1555格式 |
gfxPicHeight |
UI文件的高,argb1555格式 |
gfxRotateType |
UI文件旋转角度,0:0°, 1:90°, 2:180°, 3:270° |
3.3.3 VDEC参数¶
| 参数 | 说明 |
|---|---|
vdecDevNum |
vdec 设备个数,最大为2,nvr demo中只开启vdec0,因此只能配置为1 |
vdecArgs_0 |
vdec0 的参数配置 |
vdecArgs_0参数说明:
| 参数 | 说明 |
|---|---|
chnNum |
通道数,1~64 |
compressEn |
是否压缩,0:不压缩,1:LSYC0;LSYC 50%压缩率为有损压缩,使用限制:1、当开启压缩后级只能接disp,disp支持LSYD,2、当port0打开LSYC功能,port1/port2必须关闭LSYC功能;当port0关闭LSYC功能时,port1/port2各自可打开或关闭LSYC功能,3、LSYC功能不支持H265使用了多Tile划分(图像参数集PPS语法中tiles_enabled_flag为1)的码流,若解码到这类码流,LSYC功能会被强制关闭 |
vdecAttr |
vdec chn参数配置 |
vdecAttr参数说明:
| 参数 | 说明 |
|---|---|
chnId |
通道id |
picWidth |
码流的宽(可以不用填写,程序中通过解析码流sps信息获取) |
picHeight |
码流的高(可以不用填写,程序中通过解析码流sps信息获取) |
codecType |
码流类型,0:h264, 1:h265 |
refFrameNum |
最大参考帧数量,大于2时生效(可以不用填写,程序中通过解析码流sps信息获取) |
esAddHead |
码流是否加头,0:不加头,1:加头 |
filePath |
码流文件路径 |
3.4 输入文件¶
- 配置文件:
sdk/verify/sample_code/demo/nvr/nvr/config_nvr.json - 资源文件位于
sdk/verify/sample_code/demo/nvr/nvr/resource路径下:- UI图片:
1920x1080_argb1555.bin - 鼠标图标:
cursor_argb1555.bin - 码流文件:
720x576@30.h265
- UI图片:
4. 运行说明¶
4.1 程序部署¶
-
将编译出来的可执行文件
sgs_demo_nvr拷贝到板端或者NFS/CIFS挂载目录下,并修改权限为777。 -
将配置文件
config_nvr.json以及资源文件(UI图片、鼠标图标、码流文件)拷贝到sgs_demo_nvr同级目录,如下:sgs_demo_nvr # nvr demo 可执行文件 config_nvr.json # 配置文件 720x576@30.h265 # 配置文件中使用的码流文件 1920x1080_argb1555.bin # 配置文件中使用的UI图片 cursor_argb1555.bin # 配置文件中使用的鼠标图标
4.2 运行 Demo¶
./sgs_demo_nvr config_nvr.json
4.3 测试用例操作¶
程序运行后会显示测试用例列表,输入不同的case测试命令运行不同的case,根据终端提示进行输入。
命令行等待输入示例:
[-------Test case list------]
|-> 0: exit
|-> 1: splite windows manually
|-> 2: splite windows automatically
|-> 3: change timing manually
|-> 4: change timing automatically
|-> 5: PIP
|-> 6: zoom
|-> 7: capture pic
|-> 8: pause
|-> 9: vdisp case
|->10: get vdec state
|->11: set CSC
|->12: show mouse
|->13: set send frame time interval(ms),default is 10ms
|->14: set fb alpha, default is 0x77
|->15: copy argb and rotate by gfx
|->16: copy yuv and rotate by gfx
|->17: draw argb to framebuffer directly
|->18: scl stretch test
|->19: resvered
|->20: gfx fill
|->21: ui scaling up 1080P to 4K
|->22: Homologous–heterologous switching
|->23: wbc
|->24: eptz
|->25: set colorkey
|->26: dual layer UI blending
Please input number:
4.3.1 测试用例¶
| 用例ID | 测试目标 | 操作步骤 | 执行命令 | 预期结果 |
|---|---|---|---|---|
| NVR-01 | 多通道视频解码显示 | 1. 启动程序 2. 等待视频自动播放 3. 验证画面布局 |
程序启动后自动播放 | 多路视频同时解码显示,画面布局按照配置文件中的chnNum参数自动分配,显示正常无花屏 |
| NVR-02 | 手动切屏功能 | 1. 程序启动后输入12. 根据提示输入切屏模式 3. 验证画面切换 |
输入1后根据提示操作 |
画面按照用户输入的模式切换,所有画面正常显示 |
| NVR-03 | 自动切屏功能 | 1. 程序启动后输入22. 等待自动切换 3. 验证切换效果 |
输入2 |
每5秒自动随机切换画面布局,切换过程平滑无闪烁 |
| NVR-04 | 手动切换分辨率 | 1. 程序启动后输入32. 根据提示选择分辨率 3. 验证显示效果 |
输入3后选择分辨率 |
HDMI输出分辨率切换为选定值,画面正常显示 |
| NVR-05 | 自动切换分辨率 | 1. 程序启动后输入42. 等待自动切换 3. 验证显示效果 |
输入4 |
每5秒自动随机切换分辨率,切换过程正常 |
| NVR-06 | PIP画中画功能 | 1. 程序启动后输入52. 验证PIP显示效果 |
输入5 |
全屏画面显示画中画效果,数据流:vdec_0_0_0->scl_1_0_0->disp_0_64_0 |
| NVR-07 | ZOOM缩放功能 | 1. 程序启动后输入62. 根据提示选择缩放参数 3. 验证缩放效果 |
输入6后根据提示操作 |
画面按指定比例放大,可查看画面细节 |
| NVR-08 | 抓图功能 | 1. 程序启动后输入72. 根据提示选择通道 3. 验证抓图文件 |
输入7后根据提示操作 |
生成抓图文件(JPEG格式),抓图内容与当前显示画面一致 |
| NVR-09 | 静帧功能 | 1. 程序启动后输入82. 选择要静帧的通道 3. 验证静帧效果 |
输入8后选择通道 |
指定通道画面停止更新,其他通道继续正常播放 |
| NVR-10 | 获取VDEC状态 | 1. 程序启动后输入102. 查看状态信息 |
输入10 |
终端输出所有VDEC通道的状态信息 |
| NVR-11 | 设置CSC参数 | 1. 程序启动后输入112. 根据提示调整参数 3. 验证画面变化 |
输入11后调整参数 |
HDMI输出画面色彩实时变化(对比度、亮度、色度、饱和度等) |
| NVR-12 | 鼠标显示和移动 | 1. 程序启动后输入122. 移动鼠标 3. 验证鼠标显示 |
输入12 |
屏幕显示鼠标图标,鼠标移动时图标跟随移动 |
| NVR-13 | 设置送帧间隔 | 1. 程序启动后输入132. 输入间隔时间 3. 验证效果 |
输入13后输入间隔值 |
VDEC送帧间隔按设定值调整 |
| NVR-14 | 设置Alpha值 | 1. 程序启动后输入142. 输入Alpha值 3. 验证透明效果 |
输入14后输入Alpha值(0~ff) |
UI图层透明度按设定值变化 |
| NVR-15 | GFX缩放旋转 | 1. 程序启动后输入152. 验证GFX操作效果 |
输入15 |
UI文件经GFX缩放、旋转、镜像、Alpha混合后显示到framebuffer |
| NVR-16 | YUV旋转保存 | 1. 程序启动后输入162. 验证保存文件 |
输入16 |
YUV420SP数据经GFX旋转后保存到文件 |
| NVR-17 | 直接绘制ARGB | 1. 程序启动后输入172. 验证显示效果 |
输入17 |
UI文件直接读取到framebuffer显示 |
| NVR-18 | SCL拉伸测试 | 1. 程序启动后输入182. 验证拉伸效果 |
输入18 |
画面经SCL拉伸后正常显示 |
| NVR-20 | GFX填充 | 1. 程序启动后输入202. 验证填充效果 |
输入20 |
GFX执行quickfill到framebuffer,包括drawrect和colorkey设置 |
| NVR-21 | FB放大功能 | 1. 先通过case 3设置分辨率为3840x2160 2. 修改fb_timing_width和fb_timing_height 3. 执行case 21 |
输入21 |
1920x1080画面放大到4K显示 |
| NVR-22 | 同源/异源切换 | 1. 准备两块显示屏 2. 程序启动后输入 223. 选择切换模式 |
输入22后选择模式 |
同源模式:两个屏幕显示相同内容;异源模式:两个屏幕显示不同内容 |
| NVR-23 | 零通道编码 | 1. 程序启动后输入232. 验证编码文件 |
输入23 |
WBC数据经VENC编码后保存到文件 |
| NVR-24 | EPTZ功能 | 1. 程序启动后输入242. 验证EPTZ显示 |
输入24 |
1路全景画面+5路EPTZ画面同时显示 |
| NVR-25 | 设置ColorKey | 1. 程序启动后输入252. 输入ColorKey值 3. 验证效果 |
输入25后输入值 |
按设定的ColorKey值进行颜色键控 |
| NVR-26 | 双层UI融合 | 1. 修改板端config.json 2. 设置fbUiMix为1 3. 程序启动后输入 26 |
输入26 |
两个UI图层叠加显示,支持Alpha混合 |
5. 运行结果说明¶
5.1 正常运行状态¶
程序启动后,会在终端显示测试用例列表,并等待用户输入。同时屏幕上会显示配置的视频画面。
5.2 各功能场景运行结果¶
5.2.1 多通道视频解码显示¶
- 多路视频同时解码并显示在屏幕上
- 画面布局按照配置文件中的
chnNum参数自动分配
5.2.2 画面切换功能¶
- 手动切屏(case 1):根据用户输入切换画面布局
- 自动切屏(case 2):每5秒自动随机切换画面布局
5.2.3 分辨率切换功能¶
- 手动切换(case 3):用户选择分辨率进行切换
- 自动切换(case 4):每5秒自动随机切换分辨率
5.2.4 PIP功能(case 5)¶
- 全屏画面显示画中画效果
- 数据流:vdec_0_0_0->scl_1_0_0->disp_0_64_0
5.2.5 ZOOM功能(case 6)¶
- 支持画面缩放显示
- 可放大查看画面细节
5.2.6 抓图功能(case 7)¶
- 支持实时抓图保存
- 可选是否进行放大处理
5.2.7 EPTZ功能(case 24)¶
- 1路全景画面 + 5路EPTZ画面同时显示
- 支持电子云台控制
5.3 常见问题¶
5.3.1 压缩功能注意事项¶
- 当开启压缩后级只能接
disp,disp支持LSYD - 当port0打开LSYC功能,port1/port2必须关闭LSYC功能
- 当port0关闭LSYC功能时,port1/port2各自可打开或关闭LSYC功能
- LSYC功能不支持H265使用了多Tile划分(图像参数集PPS语法中tiles_enabled_flag为1)的码流,若解码到这类码流,LSYC功能会被强制关闭
5.3.2 特殊case注意事项¶
FB放大功能(case 21):
- 确保分辨率为3840x2160,可以通过case 3进行设置
- 修改fb_timing_width和fb_timing_height为3840和2160
- u16Xpos和u16Ypos必须为(0,0)
同源/异源切换(case 22):
- 需要准备两块屏幕,支持hdmi&vga/hdmi&ttl/hdmi&mipi/hdmi&bt1120切换测试
- 如果使用bt1120需要准备bt1120转hdmi转板
- 执行转板驱动程序:
./LT8618SX_BT1120_to_HDMI_Reg_setting_U2_U3_20210127 1 12 - 确保当前分辨率和帧率为4K30
- D3 开发板上只支持异源 hdmi&mipi的组合
双层UI融合(case 26):
- 需要将板端
/misc/config.json文件中mi_fb内容修改为特定配置,修改完成后重启 - 使用命令
ls /dev/fb*查看是否有fb2设备节点 - 需要将程序运行的配置文件
config_nvr.json中的fbUiMix值设置为1