|
发表于 2021-8-10 10:12:42
只看该作者
6#
这个回答万事皆可用...., 若脚踏实地实事求是的做事情的话,
参考api文档如下, 哪一句和#4 楼问题"step2. 参考您找个帖子给另外一位同学的建议,关闭开机启动后也无效," 有关联?
https://wiki.t-firefly.com/zh_CN ... ml#mo-kuai-jie-shao
- 视频
- VI
- VI 为视频输入模块,可以理解为摄像头采集模块,需要注意的是 VI 需要 RKAIQ 的支持,在使用 VI 前需要提前初始化好 RKAIQ,详细初始化步骤可以在 Example 中查看。
- VI 通道属性设置
- MPP_CHN_S stViChn; #定义模块设备通道结构体
- stViChn.enModId = RK_ID_VI; #模块号为 RK_ID_VI
- stViChn.s32ChnId #设置 VI 通道号
- VI_CHN_ATTR_S vi_chn_attr; #定义 VI 通道属性结构体指针
- vi_chn_attr.u32BufCnt # VI 捕获视频缓冲区计数
- vi_chn_attr.u32Width # video 宽度
- vi_chn_attr.u32Height # video 高度
- vi_chn_attr.enWorkMode # VI 通道工作模式
- vi_chn_attr.pcVideoNode # video 节点路径
- vi_chn_attr.enPixFmt # video 格式
- 设置 VI 通道属性
- #函数定义:
- RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn, const VI_CHN_ATTR_S *pstChnAttr);
- # ViPipe 为 VI 管道号;ViChn 为 VI 通道号; pstChnAttr 为 VI 通道属性结构体指针。
- #使用示例:
- RK_MPI_VI_SetChnAttr(vi_pipe, stViChn.s32ChnId, &vi_chn_attr);
- 启用 VI 通道
- #函数定义:
- RK_S32 RK_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn);
- # ViPipe 为 VI 管道号; ViChn 为 VI 通道号。
- #使用示例:
- RK_MPI_VI_EnableChn(vi_pipe, stViChn.s32ChnId);
- VDEC
- VDEC 模块,即视频解码模块。本模块支持多路实时解码,且每路解码独立,支持 H264/H265/MJPEG/JPEG 解码。
- 解码通道属性设置
- MPP_CHN_S stVdecChn; #定义模块设备通道结构体
- stVdecChn.enModId = RK_ID_VDEC; #模块号为 RK_ID_VDEC
- stVdecChn.s32ChnId #设置解码通道号
- VDEC_CHN_ATTR_S stVdecAttr; #定义解码通道属性结构体
- stVdecAttr.enCodecType #解码格式
- stVdecAttr.enMode #解码输入模式,支持帧/流
- stVdecAttr.enDecodecMode #解码模式,支持硬件或软件解码
- 创建 VDEC 解码通道
- #函数定义:
- RK_S32 RK_MPI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);
- # VdChn 为解码通道号; pstAttr 为解码通道属性指针。
- #使用示例:
- RK_MPI_VDEC_CreateChn(stVdecChn.s32ChnId, &stVdecAttr);
- RGA
- RGA 模块用于 2D 图像的裁剪、格式转换、缩放、旋转、图片叠加等。
- 使用 RGA 处理可以大大降低 CPU 的负担,同时加快图片的处理速度。(参考:1080p 图片格式转换。RGA 耗时:7ms,Opencv 耗时:50ms)
- rkmedia 中 RGA 通道仅支持裁剪、格式转换、缩放、旋转功能,图片叠加则需要单独调用librga.so库,参见《Rockchip_Developer_Guide_Linux_RGA_CN.pdf》
- RGA 通道属性设置
- MPP_CHN_S stRgaChn; #定义模块设备通道结构体
- stRgaChn.enModId = RK_ID_RGA; #模块号为 RK_ID_RGA
- stRgaChn.s32ChnId #设置解码通道号
- RGA_ATTR_S stRgaAttr; #定义 RGA 属性结构体
- stRgaAttr.bEnBufPool #使能缓冲池
- stRgaAttr.u16BufPoolCnt #缓冲池计数
- stRgaAttr.u16Rotaion #旋转 取值范围 0,90,180,270
- stRgaAttr.stImgIn.u32X # RGA 通道输入图片的X轴坐标
- stRgaAttr.stImgIn.u32Y # RGA 通道输入图片的Y轴坐标
- stRgaAttr.stImgIn.imgType # RGA 通道输入图片格式
- stRgaAttr.stImgIn.u32Width #输入图片宽度
- stRgaAttr.stImgIn.u32Height #输入图片高度
- stRgaAttr.stImgIn.u32HorStride #输入图片虚宽
- stRgaAttr.stImgIn.u32VirStride #输入图片虚高
- stRgaAttr.stImgOut.u32X # RGA 通道输出图片的 X 轴坐标
- stRgaAttr.stImgOut.u32Y # RGA 通道输出图片的 Y 轴坐标
- stRgaAttr.stImgOut.imgType # RGA 通道输出图片格式
- stRgaAttr.stImgOut.u32Width #输出图片宽度
- stRgaAttr.stImgOut.u32Height #输出图片高度
- stRgaAttr.stImgOut.u32HorStride #输出图片虚宽
- stRgaAttr.stImgOut.u32VirStride #输出图片虚高
- 创建 RGA 通道
- #函数定义:
- RK_S32 RK_MPI_RGA_CreateChn(RGA_CHN RgaChn, RGA_ATTR_S *pstRgaAttr);
- # RgaChn 为 RGA 通道号; pstAttr 为 RGA 通道属性指针。
- #使用示例:
- RK_MPI_RGA_CreateChn(stRgaChn.s32ChnId, &stRgaAttr);
- stride 宽度,通常与 buffer_width 相同。若 u32VirWidth 大于 buffer 宽度,则必须满足 16 对齐。 可使用 CELING_2_POWER 函数对变量进行 16 对齐设置。例如:
- stRgaAttr.stImgOut.u32VirStride = CELING_2_POWER(u32Height,16);
- VO
- VO 模块用于视频输出管理。VO 模块是对 DRM/KMS 的封装,支持多 VOP 以及多图层显示。
- MPP_CHN_S VoChn; #定义模块设备通道结构体
- VO_CHN_ATTR_S stVoAttr = {0}; #定义视频输出属性结构体并初始化为 0
- memset(&stVoAttr, 0, sizeof(stVoAttr));
- stVoAttr.pcDevNode = "/dev/dri/card0"; #视频 VO 输出设备节点设置为"/dev/dri/card0"
- stVoAttr.emPlaneType #视频输出图层类型
- stVoAttr.enImgType #输入图片格式
- stVoAttr.u16Zpos #输出图层 Z 轴高度
- stVoAttr.u32Width #视频输出宽度
- stVoAttr.u32Height #视频输出高度
- stVoAttr.stImgRect.s32X #视频输入图像区域的 X 轴坐标
- stVoAttr.stImgRect.s32Y #视频输入图像区域的 Y 轴坐标
- stVoAttr.stImgRect.u32Width #输入图像区域的宽度
- stVoAttr.stImgRect.u32Height #输入图像区域的高度
- stVoAttr.stDispRect.s32X #显示区域的起始 X 轴坐标
- stVoAttr.stDispRect.s32Y #显示区域的起始 Y 轴坐标
- stVoAttr.stDispRect.u32Width #显示区域的宽度
- stVoAttr.stDispRect.u32Height #显示区域的高度
- VoChn.enModId = RK_ID_VO; #模块号为 RK_ID_VO
- VoChn.s32DevId #模块设备号
- VoChn.s32ChnId #模块通道号
- 创建 VO 通道
- #函数定义:
- RK_S32 RK_MPI_VO_CreateChn(VO_CHN VoChn, const VO_CHN_ATTR_S *pstAttr);
- # VoChn 为 VO 通道号;pstAttr 为 VO 通道属性指针。
- #使用示例:
- RK_MPI_VO_CreateChn(VoChn.s32ChnId, &stVoAttr);
- VENC
- VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立,编码协议和编码 profile 可以不同。支持视频编码同时,调度 Region 模块对编码图像内容进行叠加和遮挡。支持 H264/H265/MJPEG/JPEG 编码。
- MPP_CHN_S stVenChn; #定义模块设备通道结构体
- stVenChn.enModId = RK_ID_VENC; #模块号设置为 RK_ID_VENC
- stVenChn.s32ChnId #编码通道号
- memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));
- VENC_CHN_ATTR_S venc_chn_attr; #定义 VENC 通道属性结构体
- venc_chn_attr.stVencAttr.enType #编码格式
- venc_chn_attr.stVencAttr.imageType #编码图片格式
- venc_chn_attr.stVencAttr.u32PicWidth #图片宽度
- venc_chn_attr.stVencAttr.u32PicHeight #图片高度
- venc_chn_attr.stVencAttr.u32VirWidth #图片虚宽
- venc_chn_attr.stVencAttr.u32VirHeight #图片虚高
- venc_chn_attr.stVencAttr.u32Profile #用于H264编码器的 Profile IDC 值
- H264 或 H265 编码的参数参照以下配置
- venc_chn_attr.stRcAttr.enRcMode #编码协议类型 根据具体使用编码格式配置
- venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = fps; # I 帧间隔,取值范围:[1, 65536]
- venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate =
- u32Width * u32Height * fps / 14; #平均比特率,取值范围:[2000, 98000000],单位:bps
- venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1; #目标帧率分子
- venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = fps; #目标帧率分母
- venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1; #数据源帧率分子
- venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = fps; #数据源帧率分母
- 创建 VENC 通道
- #函数定义:
- RK_S32 RK_MPI_VENC_CreateChn(VENC_CHN VeChn, VENC_CHN_ATTR_S *stVencChnAttr);
- # VeChn 为编码通道号; stVencChnAttr 编码通道属性指针。
- #使用示例:
- RK_MPI_VENC_CreateChn(stVenChn.s32ChnId, &venc_chn_attr);
- 通道绑定
- 设置好通道属性之后就可以对通道进行绑定了。
- 数据源和数据接收者绑定接口如下:
- RK_S32 RK_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn,const MPP_CHN_S *pstDestChn);
- #pstSrcChn 为源通道指针; pstDestChn 目的通道指针。
- 注:通道绑定需要注意源通道的输出与目的通道的输入的数据格式要对应。
- 通道数据发送与获取
- 常用向指定通道输入数据函数如下:
- RK_S32 RK_MPI_SYS_SendMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, MEDIA_BUFFER buffer);
- # enModID 为模块号; s32ChnID 为通道号; buffer 为缓冲区。
- 常用向指定通道获取数据函数如下:
- MEDIA_BUFFER RK_MPI_SYS_GetMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, RK_S32 s32MilliSec);
- # enModID 为模块号; s32ChnID 为通道号; s32MilliSec 为阻塞等待时间,当该值为 -1 的时候表示阻塞等待。
复制代码 |
|