hi_mpi_venc_start_chn
VENC性能指标说明
性能指标说明
720p指分辨率为1280*720的图片;1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。
单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):
表1 Atlas 200/500 A2推理产品性能规格说明
| 场景举例 | 总帧率 |
|---|---|
| 720p*n路(1≤n≤3) | n*400fps |
| 720p*n路(n>3) | 1200fps |
| 1080p*n路(1≤n≤3) | n*200fps |
| 1080p*n路(n>3) | 600fps |
| 4k*n路(1≤n≤3) | n*50fps |
| 4k*n路(n>3) | 150fps |
注:其它分辨率可以等量估算。
hi_mpi_venc_create_chn
函数功能
创建编码通道。
约束说明
-
单个Device上的通道号不能超出最大的通道号范围。
-
编码通道属性由三部分组成,编码器属性、码率控制器属性和帧结构类型属性,帧结构类型属性简称GOP(Group of Pictures )类型属性。
-
编码器属性必须设置编码码流buffer深度、获取码流方式、编码profile等,表1详细描述了各种协议的各项属性的特性。
-
推荐的编码宽高为:3840*2160(4k)、1920*1080(1080P)、1280*720(720P)。
-
H.264/H.265编码帧存由YHeaderSize、CHeaderSize、YSize、CSize、PmeSize、PmeInfoSize和TmvSize共同构成,编码器默认根据最大宽高计算帧存进行内存分配,在设置通道宽高时需保证根据通道宽高计算的每一部分帧存大小都不能大于最大宽高计算的帧存大小。
-
码率控制器属性中的输入/输出帧率(src_frame_rate/dst_frame_rate)是用于配合编码过程中的码率(bit_rate)分配,不是最终的播放器显示帧率,若想要设置显示帧率请参考hi_mpi_venc_set_h264_vui或hi_mpi_venc_set_h265_vui接口。
建议用户将码控帧率与显示帧率设置一致,否则播放时的码率可能与用户设置的编码码率不同,播放时的码率会随着所设置的显示帧率而变化。
函数原型
hi_s32 hi_mpi_venc_create_chn(hi_venc_chn chn, const hi_venc_chn_attr *attr)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 (说明:对于 Atlas 200/500 A2推理产品 , 昇腾虚拟化实例(Ascend Virtual Instance)场景下,VENC通道 = ( 被分配的VENC硬件单元 / VENC硬件单元 ) * 128,如果通道总数不为整数,则向下取整。JPEGE的通道数不随算力影响,但JPEGE+VENC的总通道数最大128。) |
| attr | 输入 | 编码通道属性的指针。 |
返回值说明
- 0:成功
- 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
参考信息
表1 编码器属性的约束
编码协议 | 编码方式 | 码流 buffer 深度 | 获取码流模式 | 编码 profile |
|---|---|---|---|---|
H.264 | Frame | Frame/Slice | Baseline Mainprofile Highprofile | |
JPEG | Frame | Frame/Ecs | Baseline | |
H.265 | Frame | Frame/Slice | Main profile Main 10 profile(暂不支持) | |
Frame/Slice | Main 10 profile(暂不支持) |
hi_mpi_venc_destroy_chn
函数功能
用户退出编码流程时,需要关闭之前打开的编码通道,以释放相关资源。
约束说明
- 销毁并不存在的通道,返回失败。
- 销毁前必须停止接收图像,否则返回失败。
函数原型
hi_s32 hi_mpi_venc_destroy_chn(hi_venc_chn chn)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 |
返回值说明
- 0:成功
- 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
hi_mpi_venc_start_chn
函数功能
开启编码通道接收输入图片,允许指定接收帧数,超出指定的帧数后自动停止接收图像。
约束说明
- 如果通道未创建,则返回错误码HI_ERR_VENC_UNEXIST。
- 需要接收的图像帧数设置为-1时表示不指定帧数。
- 如果通道已经开始接收图像,没有停止接收图像前再一次调用此接口指定接收帧数,返回操作不允许。
- 如果通道已经开始接收图像,没有停止接收图像前允许再一次调用此接口不指定接收帧数。
- 只有开启接收之后编码器才开始接收图像编码。
函数原型
hi_s32 hi_mpi_venc_start_chn(hi_venc_chn chn, const hi_venc_start_param *recv_param)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 |
| recv_param | 输入 | 接收图像参数的指针,用于指定需要接收的图像帧数。 |
返回值说明
- 0:成功
- 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
hi_mpi_venc_stop_chn
函数功能
停止编码通道接收输入图片。
约束说明
- 如果通道未创建,则返回失败。
- 此接口并不判断当前是否停止接收,即允许重复停止接收不返回错误。
- 此接口用于编码通道停止接收图像来编码,在编码通道销毁或复位前必须停止接收图像。
- 调用此接口仅停止接收原始数据编码,码流buffer并不会被清除。
函数原型
hi_s32 hi_mpi_venc_stop_chn(hi_venc_chn chn)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 |
返回值说明
- 0:成功
- 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
hi_mpi_venc_query_status
函数功能
查询编码通道状态。
约束说明
- 如果通道未创建,则返回失败。
- 此接口用于查询此函数调用时刻的编码器状态,status包含以下信息:
-
在编码通道状态结构体中,left_pics表示待编码的帧个数。在复位通道前,可以通过查询是否还有图像待编码来决定复位时机,防止复位时将可能需要编码的帧清理出去。
-
在编码通道状态结构体中,left_stream_bytes表示码流buffer中用户暂未取走的byte数目。
在复位通道前,可以通过查询是否还有码流没有被处理来决定复位时机,防止复位时将可能需要的码流清理出去。
-
在编码通道状态结构体中,left_stream_frames表示码流buffer中用户暂未取走的帧数目。
在复位通道前,可以通过查询是否还有图像的码流没有被取走来决定复位时机,防止复位时将可能需要的码流清理出去。
-
在编码通道状态结构体中,cur_packs表示当前帧的码流包个数。在调用hi_mpi_venc_get_stream之前应确保cur_packs大于0。
在按包获取时当前帧可能不是一个完整帧(被取走一部分),按帧获取时表示当前一个完整帧的包个数(如果没有一帧数据则为 0)。用户在需要按帧获取码流时,需要查询一个完整帧的包个数,在这种情况下,通常可以在select成功后执行query操作,此时,cur_packs是当前完整帧中包的个数。
-
在编码通道状态结构体中,left_recv_pics表示调用hi_mpi_venc_start_chn接口后剩余等待接收的帧数目。
-
在编码通道状态结构体中,left_enc_pics表示调用hi_mpi_venc_start_chn接口后剩余等待编码的帧数目。
-
如果调用hi_mpi_venc_start_chn但没有指定接收帧数,left_recv_pics和left_enc_pics数目始终为0。
-
函数原型
hi_s32 hi_mpi_venc_query_status(hi_venc_chn chn, hi_venc_chn_status *status)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 |
| status | 输出 | 编码通道状态的指针。 |
返回值说明
- 0:成功
- 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
hi_mpi_venc_get_stream
函数功能
获取编码的码流。
约束说明
-
如果通道未创建,返回失败。
-
如果stream为空,返回错误码HI_ERR_VENC_NULL_PTR。
-
如果milli_sec小于-1,返回错误码HI_ERR_VENC_ILLEGAL_PARAM。
-
支持超时方式获取。支持select/poll系统调用。
- milli_sec = 0 时,则为非阻塞获取,即如果缓冲无数据,则返回错误码HI_ERR_VENC_BUF_EMPTY。
- milli_sec = -1 时,则为阻塞,即如果缓冲无数据,则会等待有数据时才返回获取成功。
- milli_sec > 0 时,则为超时,即如果缓冲无数据,则会等待用户设定的超时时间,若在设定的时间内有数据则返回获取成功,否则返回超时失败。
-
支持按包或按帧方式获取码流。如果按包获取,则:
- 对于JPEG编码协议, 每次获取的是一个参数包或数据包。
- 对于H.265编码协议,每次获取的是一个 NAL 单元。
-
码流结构体hi_venc_stream包含以下部分:
-
码流包信息指针pack
指向一组hi_venc_pack结构体的连续的内存空间,该空间由调用者分配。如果是按包获取,则此空间不小于sizeof(hi_venc_pack)的大小;如果按帧获取,则此空间不小于N*sizeof(hi_venc_pack)的大小,其中,N代表当前帧之中的包的个数,可以在 select之后通过hi_mpi_venc_query_status接口获得。
-
码流包个数pack_cnt
在输入时,此值指定pack中hi_venc_pack结构体内存的个数。按包获取时,pack_cnt必须不小于 1;按帧获取时,pack_cnt必须不小于当前帧的包个数。在函数调用成功后,pack_cnt返回实际填充pack的包的个数。
-
序列号seq按帧获取时是帧序列号;按包获取时为包序列号。
-
码流特征信息,数据类型为联合体,包含了不同编码协议对应的码流特征信息h264_info/jpeg_info/h265_info,码流特征信息的输出用于支持用户的上层应用。
-
码流高级特征信息,数据类型为联合体,包含了不同编码协议对应的码流高级特征信息h264_adv_info/h265_adv_info,码流高级特征信息的输出用于支持用户的上层应用。
-
-
如果用户长时间不获取码流,码流缓冲区就会满。一个编码通道如果发生码流缓冲区满,就会不再启动编码,直到用户获取码流并释放码流,从而有足够的码流缓冲可以用于编码时,才开始继续编码。
-
建议用户获取码流接口调用与释放码流的接口调用成对出现,且尽快释放码流,防止出现由于用户获取码流,释放不及时而导致的码流buffer满,停止编码。
-
建议用户使用select方式获取码流,且按照如下的流程:
- 调用hi_mpi_venc_query_status 函数查询编码通道状态;
- 确保cur_packs和left_stream_frames同时大于0;
- 调用malloc分配cur_packs个包信息结构体;
- 调用hi_mpi_venc_get_stream获取编码码流;
- 调用hi_mpi_venc_release_stream释放码流缓存。
-
当one_stream_buf为1时,用户获取一帧码流时只会得到一个码流包(不包含用户数据)的地址,即pack_cnt为1,地址为pack[0].addr。而在hi_venc_pack结构体中增加offset,用来指出一帧码流中有效数据的地址和pack[0].addr的偏移。如图1所示(以 H.264 单包为例),pack[0].data_num = 3,即3种NAL包,分别为SPS、PPS、SEI:
- pack[0].pack_info[0]. pack_type. h264_type = HI_VENC_H264_NALU_SPS
- pack[0].pack_info[1]. pack_type. h264_type = HI_VENC_H264_NALU_PPS
- pack[0].pack_info[2]. pack_type. h264_type = HI_VENC_H264_NALU_SEI
其他协议以此类推,data_num和 pack_info只在单包模式才有意义。
-
两种模式可通过调用接口hi_mpi_venc_set_mod_param设置h.265e/h264e/jpege模块参数one_stream_buf来选择。
- one_stream_buf=1 表示单包模式;注意,JPEGE目前只支持单帧单包模式。
- one_stream_buf=0 表示非单包模式,系统默认one_stream_buf=0。
函数原型
hi_s32 hi_mpi_venc_get_stream(hi_venc_chn chn, hi_venc_stream *stream, hi_s32 milli_sec)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 编码通道号。 Atlas 200/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。 |
| stream | 输出 | 输出码流数据的指针。 该结构体内的addr参数配置的地址为Device上的内存地址,表示输出的码流存放在Device的内存中。 |
| milli_sec | 输入 | 超时时间,单位是毫秒。 - -1:阻塞方式 - 0:非阻塞方式 - >0:超时方式,配置具体的超时时间。超时时间受操作系统影响,一般偏差在操作系统的一个时间片内,例如,操作系统的一个时间片为4ms,用户设置的milli_sec参数值为1,则实际的超时时间在1ms到5ms范围内。在CPU负载高场景下,超时时间仍可能存在波动。 |
返回值说明
-
0:成功,获取编码结果数据成功后,需调用hi_mpi_venc_release_stream接口释放码流缓存资源。
本接口虽返回成功,但有可能获取到的是编码失败的数据,编码是否成功,需要查看hi_venc_stream结构体的pack成员下的len参数值,len=0表示编码失败。
-
非0:失败,参见VENC视频编码/JPEGE图片编码返回码
参考资源
接口调用流程及示例,参见JPEGE图片编码、VENC视频编码。
其它参考信息
图1 码流包结构图

在线提单