祝各位道友念头通达
GitHub Gitee 语雀 打赏

海思 Hi3531D 视频流获取代码流程

代码大概流程

main.c                                  |venc/sample_venc.c
 ->SAMPLE_VENC_DUALPP_CLASSIC           |venc/sample_venc.c
  ->SAMPLE_COMM_VENC_StartGetStream     |common/sample_comm_venc.c
   ->SAMPLE_COMM_VENC_GetVencStreamProc |common/sample_comm_venc.c                           
    ->rtp_send_ch0                      |common/send_h264file_rtp.c
     ->h264nal2rtp_send1                |common/send_h264file_rtp.c

详细流程

SAMPLE_VENC_DUALPP_CLASSIC
 enViMode = SAMPLE_VI_MODE_8_1080P  默认
 s32ChnNum = 4  默认四个通道数
 stVbConf.u32MaxPoolCnt 设置缓冲池最大可以容纳128
 stVbConf.astCommPool[x] 设置视频的数据块大小
 stVbConf.astCommPool[x].u32BlkCnt=32; 设置视频数据块的个数
 -> 设置视频存放的缓冲区
 ->step 2: mpp system init.
   ->HI_MPI_SYS_Exit 先销毁音频编解码通道等
   ->HI_MPI_VB_SetConf 然后设置系统配置 
   ->HI_MPI_VB_Init 然后初始化系统 
 ->step 3: start vi dev & chn to capture
   ->SAMPLE_COMM_VI_Start
   ->HI_MPI_VI_BindChn
   ->HI_MPI_VI_SetChnAttr 设置通道属性
   ->HI_MPI_VI_EnableChn 启用VI通道
 ->step 4: 获取图片大小,开启VPSS,用于图片的裁剪旋转等
 ->step 5: start stream venc 设置编码通道
  ->HI_MPI_VENC_CreateChn 创建编码通道
  ->HI_MPI_VENC_StartRecvPic 开启编码通道接收输入图像
 ->step 6: stream venc process -- get stream, then save it to file   SAMPLE_COMM_VENC_GetVencStreamProc, 采用新的线程执行
  -> step 6.1:  check & prepare save-file & venc-fd
   ->HI_MPI_VENC_GetChnAttr     获取编码通道的编码属性
   ->HI_MPI_VENC_GetFd   根据编码通道对应的设备文件句柄
  -> step 6.2:  Start to get streams of each channel.
   ->SAMPLE_COMM_VENC_GetFilePostfix  根据类型获取对用文件属性 .mp4, .h264
   ->HI_MPI_VENC_GetStreamBufInfo  获取码流的物理地址和大小
     ->HI_MPI_VENC_Query 查询当前帧包含多少包
     ->stStream.pstPack=(VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks); 申请内存地址
     ->HI_MPI_VENC_GetStream 获取帧数据
     ->SAMPLE_COMM_VENC_SaveStream 保存为文件
     ->rtp_send_ch0 构造RTP包通过网络发送
 ->step 7 退出程序 
  ->HI_MPI_SYS_UnBind  数据源到数据接收者的解绑
  ->HI_MPI_VENC_StopRecvPic 停止编码通道接收输入图像
  ->HI_MPI_VENC_DestroyChn 销毁编码通道

结构体

typedef struct hiVENC_PACK_S
{
      HI_U32   			u32PhyAddr;      /*流包首地址*/
      HI_U8   			*pu8Addr;        /*流包物理地址*/
      HI_U32   			u32Len;          /*流包长度*/
      HI_U64   			u64PTS;          /*时间戳,单位:us*/
      HI_BOOL  			bFrameEnd;       /*结束帧*/
      VENC_DATA_TYPE_U  	DataType;        /*视频类型编解码*/
      HI_U32   			u32Offset;       /*流包中有效数据与流首地址的偏移量 */
      HI_U32 			u32DataNum;      /*当前码流包序号,包含其它类型的码流包的个数*/
      VENC_PACK_INFO_S 	      stPackInfo[8];   /*当前码流包数据中包含其它类型码流包数据信息*/
}VENC_PACK_S;
typedef struct hiVENC_PACK_INFO_S
{
      VENC_DATA_TYPE_U  u32PackType;            /*当前码流包数据包含其它码流包的类型*/
      HI_U32 u32PackOffset;                     /*当前码流包数据包含其它码流包的偏移*/                
      HI_U32 u32PackLength;                     /*当前码流包数据包含其它码流包的大小*/         
}VENC_PACK_INFO_S;

mpp/include 接口参考文档: HiMPP V3.0 媒体处理软件开发参考.pdf

posted @ 2022-06-15 19:52  韩若明瞳  阅读(777)  评论(0编辑  收藏  举报