c函数原型 |
hi_s32 hi_mpi_venc_get_stream(hi_venc_chn chn, hi_venc_stream *stream, hi_s32 milli_sec); |
Python函数 |
stream, ret = acl.himpi.venc_get_stream(chn, stream, milli_sec) |
函数功能 |
获取编码的码流。 Atlas 200/300/500 推理产品,当前版本不支持该接口。 Atlas 训练系列产品,当前版本不支持该接口。 |
输入说明 |
chn:int,编码通道号。
- Atlas 推理系列产品,编码通道号的取值范围:[0, 256),JPEGE功能和VENC功能共用通道,且通道总数最多256。
- Atlas A2训练系列产品/Atlas 800I A2推理产品,编码通道号的取值范围:[0, 256),JPEGE功能通道总数最多256。
- Atlas 200I/500 A2推理产品,编码通道号的取值范围:[0, 128),JPEGE功能和VENC功能共用通道,且通道总数最多128。
stream:dict,“pack_cnt”传入“cur_packs”个包信息字典,自动分配内存,具体请参见hi_venc_stream。
milli_sec:int,超时时间,单位是毫秒。
- “-1”:阻塞方式。
- “0”:非阻塞方式。
- >0:超时方式,配置具体的超时时间。超时时间受操作系统影响,一般偏差在操作系统的一个时间片内,例如,操作系统的一个时间片为4ms,用户设置的“milli_sec”参数值为“1”,则实际的超时时间在1ms到5ms范围内。在CPU负载高场景下,超时时间仍可能存在波动。
|
返回值说明 |
ret:int,错误码。
stream:dict,码流字典。该字典内的“addr”属性配置的地址为Device上的内存地址,表示输出的码流存放在Device的内存中。
- Atlas 推理系列产品,标准形态下,用户在Host上调用该接口后,需要访问输出码流数据,则需要将Device中的数据传输回Host。
- Atlas A2训练系列产品/Atlas 800I A2推理产品,用户在Host上调用该接口后,需要访问输出码流数据,则需要将Device中的数据传输回Host。
- Atlas 200I/500 A2推理产品,EP模式下,用户在Host上调用该接口后,需要访问输出码流数据,则需要将Device中的数据传输回Host。
|
约束说明 |
- 如果通道未创建,返回失败。
- 如果“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”
在函数调用成功后,将在返回值中“stream”字典填充一组hi_venc_pack字典的列表。
- 码流包个数“pack_cnt”
在输入时,此值指定pack中要获取的“hi_venc_pack”字典的最大数量。按包获取时,“pack_cnt”必须不小于1;按帧获取时,“pack_cnt”必须不小于当前帧的包个数(可通过acl.himpi.venc_query_status接口获得)。 在函数调用成功后,返回值中“stream”字典的“pack_cnt”为实际填充pack的包个数。
- 序列号seq按帧获取时是帧序列号;按包获取时为包序列号。
- 如果用户长时间不获取码流,码流缓冲区就会满。一个编码通道如果发生码流缓冲区满,就会不再启动编码,直到用户获取码流并释放码流,从而有足够的码流缓冲可以用于编码时,才开始继续编码。
- 建议用户获取码流接口调用与释放码流的接口调用成对出现,且尽快释放码流,防止出现由于用户获取码流,释放不及时而导致的码流Buffer满,停止编码。
- 建议用户使用select方式获取码流,且按照如下的流程:
- 调用acl.himpi.venc_query_status函数查询编码通道状态。
- 确保“cur_packs”和“left_stream_frames”同时大于0。
- 构造一个“stream”字典。
stream["pack_cnt"] = cur_packs
- 调用acl.himpi.venc_get_stream传入“stream”字典,获取编码码流。
stream, ret = acl.himpi.venc_get_stream(chn, stream)
- 调用acl.himpi.venc_release_stream传入上一步返回的“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”只在单包模式才有意义。
- 两种模式可通过调用接口acl.himpi.venc_set_mod_param设置h.265e/h264e/jpege模块参数“one_stream_buf”来选择。
- one_stream_buf = 1 表示单包模式(JPEGE目前只支持单帧单包模式)。
- one_stream_buf = 0 表示多包模式,系统默认one_stream_buf = 0。
|
参考资源 |
接口调用流程,参见JPEGE图片编码、VENC视频编码。 |