---
title: hi_mpi_venc_get_stream
description: "获取编码的码流。"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_03_1047.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_03_1047.html
indexId: 09fb7ada5a3178c9be44cb15aa1dc9d0bde72383982ecc12ea8226b9f0b719e8105
---
# 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 码流包结构图
