代码大概流程
| 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; |
| 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界