海思 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
本文来自博客园踩坑狭,作者:韩若明瞳,转载请注明原文链接:https://www.cnblogs.com/han-guang-xue/p/16379638.html