rkmedia使用记录

1.函数

1) RK_MPI_VI_SetChnAttr

_CAPI RK_S32 RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn,
                                  const VI_CHN_ATTR_S *pstChnAttr);
  /*
  VI通道属性结构体指针
  1)pcVideoNode:video节点路径
  2)u32BufCnt:VI捕获视频缓冲区计数
  3)u32Width:宽度
  4)u32Height:高度
  5)enPixFmt:视频输入的图像格式,默认是NV12;
  6)enBufType:VI捕捉视频的类型;DMA或者MMP
                DMA:直接访问内存,相当于音视频数据直接从硬件传输到内存里面。
                    优点:速度快
                    缺点:消耗资源
                MMP:内存映射,直接把硬件外设、磁盘文件映射到虚拟内存
                    优点:占用硬件资源比较少
                    缺点:读写速度比较慢;有时候会数据丢失
  7)enWorkMode:VI的工作模式,默认是NORMAL;
                NORMAL:相对于“亮度模式”,该模式下正常读取camera数据并发给后级;
                LUMA_ONLY:亮度模式,该模式仅用于亮度统计,无法通过回调函数或者RK_MPI_SYS_Get_MediaBuffer获取数据

  */
  VI_CHN_ATTR_S vi_chn_attr;
  vi_chn_attr.pcVideoNode = pDeviceName;
  vi_chn_attr.u32BufCnt = 3;
  vi_chn_attr.u32Width = u32Width;
  vi_chn_attr.u32Height = u32Height;
  vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
  vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_DMA;
  vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
  /*
    设置VI通道属性 
    函数原型:RK_S32 RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn,const VI_CHN_ATTR_S *pstChnAttr);
    参数:1)VI_PIPE ViPipe:VI管道号;
          2)VI_CHN ViChn:VI通道号,取值范围:0~VI_MAX_CHN_NUM;
          3)通道属性结构体指针
    返回值:0表示成功;非0返回错误码。
    说明:1)如果设置的通道已经通过RK_MPI_SYS_Bind()与其他通道绑定,则在这使用这个函数之前需要通过RK_MPI_SYS_UnBind()解绑;
          2)如果设置的通道已经通过RK_MPI_VI_EnableChn()使能,则在使用该函数之前需要通过RK_MPI_VI_DisableChn()解绑
  */ 
  ret = RK_MPI_VI_SetChnAttr(s32CamId, 0, &vi_chn_attr);

2)RK_MPI_VI_EnableChn

_CAPI RK_S32 RK_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn);
  /*
    启用VI通道
    函数原型:RK_S32 RK_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn)
    参数:1)VI_PIPE ViPipe:VI管道号;
          2)VI_CHN ViChn:VI通道号;
  */
  ret |= RK_MPI_VI_EnableChn(s32CamId, 0);//

3) 编码器类型

  VENC_CHN_ATTR_S venc_chn_attr;
  /*
  VENC_ATTR_S stVencAttr;    //编码器类型
  VENC_RC_ATTR_S stRcAttr;   //码率控制器
  VENC_GOP_ATTR_S stGopAttr; //GOP属性
  */
  memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));//清空设置
  
  // venc_chn_attr.stVencAttr.enRotation=VENC_ROTATION_270;//旋转270度
  venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//编码器协议类型
  venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 30;//H264协议编码通道Cbr模式属性-I帧间隔,取值范围:1-65536
  venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = u32Width * u32Height;//H264协议编码通道Cbr模式属性-数据源帧率分子
  // frame rate: in 30/1, out 30/1.
  venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//H264协议编码通道Cbr模式属性-目标帧率分母
  venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 30;//H264协议编码通道Cbr模式属性-目标帧率分子
  venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//H264协议编码通道Cbr模式属性-数据源帧率分母
  venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 30;//H264协议编码通道Cbr模式属性-数据源帧率分母

  venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//编码器类型
  venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//输入图像类型
  venc_chn_attr.stVencAttr.u32PicWidth = u32Width;//编码图像宽度,以像素为单位
  venc_chn_attr.stVencAttr.u32PicHeight = u32Height;//编码图像高度,以像素为单位
  venc_chn_attr.stVencAttr.u32VirWidth = u32Width;//stride宽度,通常与buffer_width相同,如果u32VirWidth大于buffer宽度,则必须满足16对齐
  venc_chn_attr.stVencAttr.u32VirHeight = u32Height;//stride宽度,通常与buffer_height相同,如果u32VirHeight大于buffer宽度,则必须满足16对齐
  /*
  编码等级:
  1)H264:66-baseline;77-main profile;100-high profile
  2)H265:默认是Main
  3)Jpege/MJpege:默认是baseline
  */
  venc_chn_attr.stVencAttr.u32Profile = 77;

 3)RK_MPI_VENC_CreateChn

_CAPI RK_S32 RK_MPI_VENC_CreateChn(VENC_CHN VencChn,
                                   VENC_CHN_ATTR_S *stVencChnAttr);
  /*
    创建编码通道
    函数原型:RK_S32 RK_MPI_VENC_CreateChn(VENC_CHN VeChn, VENC_CHN_ATTR_S *stVencChnAttr)
    参数:1)VENC_CHN VeChn:编码通道
          2)VENC_CHN_ATTR_S *stVencChnAttr:编码通道属性指针
    返回值:成功为0;失败为非0
  */
  ret = RK_MPI_VENC_CreateChn(0, &venc_chn_attr);

你可能感兴趣的:(linux)