acl.himpi.venc_get_stream

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)

函数功能

获取编码的码流。

输入说明

chn:编码通道号。

昇腾310 AI处理器上,编码通道号固定为0。

昇腾910 AI处理器上,编码通道号固定为0。

stream:pack_cnt传入cur_packs个包信息字典,自动分配内存

milli_sec:超时时间,单位是毫秒。
  • -1:阻塞方式
  • 0:非阻塞方式
  • >0:超时方式,配置具体的超时时间。超时时间受操作系统影响,一般偏差在操作系统的一个时间片内,例如,操作系统的一个时间片为4ms,用户设置的milli_sec参数值为1,则实际的超时时间在1ms到5ms范围内。在CPU负载高场景下,超时时间仍可能存在波动。

返回值说明

ret

stream:码流字典。该字典内的addr参数配置的地址为Device上的内存地址,表示输出的码流存放在Device的内存中。

使用说明

注意事项

  • 如果通道未创建,返回失败。
  • 如果stream为空,返回错误码HI_ERR_VENC_NULL_PTR。
  • 如果milli_sec小于-1,返回错误码HI_ERR_VENC_ILLEGAL_PARAM。
  • 支持超时方式获取。
    • milli_sec = 0 时,则为非阻塞获取,即如果缓冲无数据,则返回错误码HI_ERR_VENC_BUF_EMPTY。
    • milli_sec = -1 时,则为阻塞,即如果缓冲无数据,则会等待有数据时才返回获取成功。
    • milli_sec > 0 时,则为超时,即如果缓冲无数据,则会等待用户设定的超时时间,若在设定的时间内有数据则返回获取成功,否则返回超时失败。
  • 昇腾310 AI处理器上,仅支持按帧方式获取码流。
  • 码流字典hi_venc_stream包含以下部分:
    • 码流包信息指针pack

      指向一组hi_venc_pack的内存空间,该空间由调用者分配。如果是按包获取,则此空间不小于 sizeof(hi_venc_pack)的大小;如果按帧获取,则此空间不小于 N × sizeof(hi_venc_pack)的大小,其中 N 代表当前帧之中的包的个数,可以在 select 之后通过查询接口获得。

    • 码流包个数 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 满,停止编码。
  • 昇腾310 AI处理器上,建议用户按照如下流程获取码流:
    1. 调用malloc 分配1个包信息字典;
    2. 调用acl.himpi.venc_get_stream设置超时时间,并获取编码码流;
    3. 调用acl.himpi.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只在单包模式才有意义。

  • 昇腾310 AI处理器上,默认采用单包模式,不支持设置。

使用场景

获取编码的码流。

图1 码流包结构图