海思视频处理流程VENC

目录

Step1 初始化系统变量,即填充VB(视频缓存池)里面的那些变量(缓存块Bm大小、数量等)

1.1 SAMPLE_COMM_VI_GetSizeBySensor

非函数调用部分

1.2 SAMPLE_COMM_SYS_CalcPicVbBlkSize

1.2 SAMPLE_COMM_SYS_CalcPicVbBlkSize

Step2 调用那些填充的变量来对MPP系统进行初始化

2.1 SAMPLE_COMM_SYS_Init

Step3 启动vi的设备和通道进行图像的采集

SAMPLE_COMM_VI_StartIspAndVi(下面的都是这个函数内部调用的)

IsSensorInput

3.1 SAMPLE_COMM_VI_StartMIPI

3.2 SAMPLE_COMM_ISP_Init

3.3 SAMPLE_COMM_ISP_RUN

3.4 SAMPLE_COMM_VI_StartDev

3.5 SAMPLE_COMM_VI_StartChn

Step4 启动VPSS并进行绑定

4.1 SAMPLE_COMM_SYS_GetPicSize

4.2 SAMPLE_COMM_VPSS_StartGroup

4.3 SAMPLE_COMM_VI_BindVpss

4.4 SAMPLE_COMM_VPSS_EnableChn

Step5 启动video进行编码

5.1 SAMPLE_COMM_VENC_Start

5.1.1 SAMPLE_COMM_SYS_GetPicSize

5.1.2 HI_MPI_VENC_CreateChn

5.1.3 HI_MPI_VENC_StartRecvPic

5.1.4 SAMPLE_COMM_VENC_BindVpss

Step6 保存文件

6.1 SAMPLE_COMM_VENC_StartGetStream

6.1.1 SAMPLE_COMM_VENC_GetVencStreamProc

6.1.1.1 HI_MPI_VENC_GetChnAttr

6.1.1.2 SAMPLE_COMM_VENC_GetFilePostfix

6.1.1.3 HI_MPI_VENC_GetFd

6.1.1.4 HI_MPI_VENC_Query

6.1.1.5 HI_MPI_VENC_GetStream

6.1.1.6 SAMPLE_COMM_VENC_SaveStream

6.1.1.7 HI_MPI_VENC_ReleaseStream


Step1 初始化系统变量,即填充VB(视频缓存池)里面的那些变量(缓存块Bm大小、数量等)

1.1 SAMPLE_COMM_VI_GetSizeBySensor

SAMPLE_COMM_VI_GetSizeBySensor 是一个通常用于视频采集系统中的函数,它根据传感器类型获取视频图像的分辨率(宽度和高度)。这个函数常见于海思(HiSilicon)等视频处理芯片的SDK中,用于配置视频输入(VI)设备。

这地方传入SAMPLE_COMM_VI_GetSizeBySensor的参数是数组指针enSize的第一个变量,即PIC_HD1080,说明最开始初始化的时候是1080P,经过这个函数采集检查之后,变成了720P,获得了这个图像的大小。因为变成了720,会执行PIC_HD720 == enSize[0]这个分支,s32ChnNum = 3,因此会变成三路码流,三路码流的大小分为为720P,PIC_VGA(640*480)和PIC_QVGA(320*240)。三路码流的意思是,从一个地方进去,输出三个,也就是会得到3个内容一样,分辨率不同的图像。这地方,就是输入了一个1080P的,得到了720P、640P、320P,一路是主码流720P,另外两路是子码流,子码流是对主码流进行裁剪处理得到的。

PS:因为enSize传入的是指针,所以enSize[0]的内容已经被SAMPLE_XXX这个函数由PIC_HD1080更改为了PIC_HD720

非函数调用部分

配置好上述三路码流大小,就可以计算缓冲区的大小了

stVbConf.u32MaxPoolCnt=128,这地方规定了上限是128,应该是指视频缓存块的上限,因为一个视频缓存池就对应一路输出码流,咱们才三路输出码流。不对,指的是视频缓存池,根据翻译,MaxPool,缓存块的英语是MaxBlock。

一个缓存池就对应一个路码流

enSize[0]现在是720P,SAMPLE_PIXEL_FORMAT是像素格式,例RGB888与RGB565是不一样,SAMPLE_SYS_ALIGN_WIDTRH是对齐。

计算得到的u32BlkSize就是一帧图像需要多少内存,也就是公共视频缓存池里面每一个缓存块的大小,传入stVbConf中,stVbConf是第二步的核心变量,计算三路,每路都不一样。

具体细节如下:

1.2 SAMPLE_COMM_SYS_CalcPicVbBlkSize

SAMPLE_COMM_SYS_CalcPicVbBlkSize 用于根据图像的分辨率、图像格式等参数计算分配内存时需要的大小。该函数通常用于视频处理过程中分配用于存储图像帧的内存块,就是计算视频缓存池里面的缓存块大小。

1.2.1 SAMPLE_COMM_SYS_GetPicSize

SAMPLE_COMM_SYS_GetPicSize 用于根据指定的图片大小类型(如 1080P、720P 等)获取对应的分辨率(宽度和高度),就是计算图片有多大。

咱们PIC_HD720,也就是给了个分辨率

1.2 SAMPLE_COMM_SYS_CalcPicVbBlkSize

根据得到的变量再进行各种计算

Step2 调用那些填充的变量来对MPP系统进行初始化

这地方重点是stVbConf这个结构体

这个结构体是核心参数,传入SAMPLE_COMM_SYS_Init调用相应是API做处理就好了

2.1 SAMPLE_COMM_SYS_Init

HI_MPI_SYS_Exit() 是海思(HiSilicon)视频处理芯片SDK中的一个函数,用于退出系统模块并释放相关资源。这个函数通常在程序结束时调用,以确保所有系统资源都被正确释放。

HI_MPI_SYS/VB_Exit()是确保之前的SYS与VB是处理干净的,保险措施。释放的时候是SYS在前,VB在后,建立的时候是VB在前,SYS在后。

这俩是VB,建立的时候

SYS在后,建立的时候

2.1.1 HI_MPI_SYS_Exit()

HI_MPI_SYS_Exit() 是海思(HiSilicon)视频处理芯片SDK中的一个函数,用于退出系统模块并释放相关资源。这个函数的主要作用是在程序结束时确保所有系统资源都被正确释放,以避免资源泄漏和其他潜在问题。

2.1.2 HI_MPI_VB_Exit()

HI_MPI_VB_Exit() 是海思(HiSilicon)视频处理芯片SDK中的一个函数,用于退出视频缓冲模块(VB,Video Buffer)并释放相关资源。这个函数通常在程序结束时调用,以确保所有视频缓冲区资源都被正确释放。

2.1.3 HI_MPI_VB_SetConf

HI_MPI_VB_SetConf 是海思(HiSilicon)视频编解码硬件平台上用于设置视频缓冲池(Video Buffer,VB)配置的一个API函数。该函数用于配置系统中视频缓冲池的属性,如块大小和块数量等,以便为后续的视频处理提供合适的缓冲区。

2.1.4 HI_MPI_VB_Init

HI_MPI_VB_Init 是用于初始化视频缓冲池(Video Buffer, VB)模块的函数。初始化视频缓冲池是使用视频处理模块的基本步骤,确保系统能够正确地分配和管理视频缓冲区资源。

2.1.5 HI_MPI_SYS_SetConf

HI_MPI_SYS_SetConf 函数用于设置系统配置参数。在视频处理系统中,系统配置(例如内存分配、模块初始化等)是初始化阶段的重要部分。正确配置系统参数是确保视频处理功能正常运行的前提。

2.1.6 HI_MPI_SYS_Init

HI_MPI_SYS_Init 是用于初始化海思多媒体处理平台系统的函数。该函数通常在应用程序的启动阶段调用,目的是初始化系统资源,为后续的视频、音频等多媒体处理功能做好准备。

补充:SYS与VB的区别

HI_MPI_VB_Init:HI_MPI_VB_Init 用于初始化视频缓冲模块(VB,Video Buffer)。这个模块负责管理视频数据的缓冲区,包括分配、释放和管理视频帧的内存。

HI_MPI_SYS_Init:启动系统中的各个子模块,如视频输入(VI)、视频输出(VO)、视频编码(VENC)、视频解码(VDEC)等。

Step3 启动vi的设备和通道进行图像的采集

第一步:初始化Sensor,启动MIPI。配置Sensor类型、旋转、镜像、翻转、宽动态等,配置MIPI接口的相关参数,包括时钟、数据速率、信号格式等,并启动MIPI接口以便接收图像数据(3.1)

第二步:初始化ISP。配置自动曝光、自动白平衡、自动对焦、内存、宽动态等(3.2)

第三步:启动ISP。开始处理来自MIPI摄像头的图像数据,进行各种图像处理操作(3.3)

第四步:启动VI设备(视频信号的输入设备)。VI设备(VI Dev)代表一个视频输入设备,它可以是一个摄像头接口、视频采集卡、或者其他的视频信号输入接口。VI设备通常负责接收来自外部视频源的原始视频数据。VI设备的主要作用是从外部视频源(如摄像头、视频采集卡)采集视频数据。ISP主要负责对采集到的原始视频数据进行图像处理,以提升图像质量。处理内容包括白平衡、曝光控制、降噪、锐化等。

第五步:启动VI通道(输入设备中的通道)。VI通道(VI Channel)是在VI设备之上创建的逻辑通道,它用于对视频数据进行进一步处理。一个VI设备可以包含多个VI通道,每个通道可以接收和处理来自不同源的视频数据流,或者对同一个源进行不同的处理。

常用Sensor的接口有三种:MIPI、LVDS、DC

可以看到,笼统上说,Step3就一个SAMPLE_COMM_VI_StartVi函数,传递的参数指针是stViConfig,所以stViConfig的配置很重要

stViConfig 是一个结构体,用于配置视频输入模块的各种参数。enViMode 是该结构体中的一个成员,表示视频输入模式或传感器类型。

stViConfig 的结构体定义:

SENSOR_TYPE 是具体的传感器类型,比如 SONY_IMX123 或 OMNIVISION_OV4689 等,需要自己填,通过设置 enViMode,告知系统所使用的具体传感器类型,以便系统根据传感器的特性进行相应的配置和处理,确保视频输入模块能够正常工作并捕获视频数据。

enRotate是设置旋转的,是直接出来,还是旋转XX度出来,enRotate的枚举类型如下:

这里选的是NONE,也就是不旋转

enNorm是设置志士标准的

这里设置的是自动

enViChnSet是设置对图像的加工,其枚举类型:

NORMAL是正常,MIRROR是把图像进行镜像的改变,FLIP是把图像进行翻转,FLIP_MIRROR是既镜像又翻转,这里设置的是NORMAL,既不镜像,又不翻转。

enWDRMode是设置宽动态的模式,根据不同的类型设置不同的宽动态模式,其枚举类型:

这里是不支持宽动态的,所以设置为NONE

SAMPLE_COMM_VI_StartIspAndVi(下面的都是这个函数内部调用的)

启动和初始化图像处理设备(例如MIPI摄像头、ISP处理器等

IsSensorInput

IsSensorInput 可能是某个具体应用程序或嵌入式系统中的一个函数或方法,用于判断传感器的输入状态或读取传感器的数据。根据命名习惯,这个函数很可能返回一个布尔值或状态信息,表示传感器是否有输入或者输入是否有效。

3.1 SAMPLE_COMM_VI_StartMIPI

  • 作用:启动MIPI(Mobile Industry Processor Interface)摄像头模块。MIPI是一种用于摄像头和显示器等设备的接口标准。在应用层去操作sensor的驱动,对sensor做一个必要的初始化
  • 细节:这个函数通常会配置MIPI接口的相关参数,包括时钟、数据速率、信号格式等,并启动MIPI接口以便接收图像数据。

3.1.1 SAMPLE_COMM_VI_SetMipiAttr

把sensor所需要的一些属性给设置进去了

3.2 SAMPLE_COMM_ISP_Init

isp就是image signal process,图像信号处理,去采集到的1帧的图像信号进行处理运算,是个芯片内部的硬件,有时候会加一个单独用来处理isp的芯片,那就不会有3518内部的isp,那就把它关掉或跳过。

  • 作用:初始化ISP(Image Signal Processor,图像信号处理器)。启动内部的isp单元,isp这个硬件被海思封装成了一个单独的线程,把这个线程运行起来,让它能做isp处理。主要用来处理图像质量的,自动曝光,自动对焦,自动白平衡等。
  • 细节:ISP用于对摄像头捕获的原始图像数据进行处理,如去噪、白平衡、曝光控制等。这个函数会设置ISP的初始配置,并准备好处理图像数据。

这地方有个ISP文档是专门讲这个的,如果想深入研究的话

3.2.1 sensor_register_callback

  • 作用:注册图像传感器的回调函数。
  • 细节:这个函数允许用户注册用于图像传感器的回调函数,回调函数通常用于处理特定事件或数据,例如传感器初始化、数据捕获等。

3.2.2 HI_MPI_AE_Register

  • 作用:注册自动曝光(AE)模块的回调函数。
  • 细节:自动曝光功能用于根据场景亮度调整摄像头的曝光参数,这个函数注册一个回调函数,用于在AE模块需要更新时通知用户进行相应处理。

3.2.3 HI_MPI_AWB_Register

  • 作用:注册自动白平衡(AWB)模块的回调函数。
  • 细节:自动白平衡功能用于根据场景色温调整摄像头的白平衡设置,这个函数注册一个回调函数,用于在AWB模块需要更新时通知用户进行相应处理。

3.2.4 HI_MPI_AF_Register

  • 作用:注册自动对焦(AF)模块的回调函数。
  • 细节:自动对焦功能用于根据场景的焦点信息调整摄像头的对焦设置,这个函数注册一个回调函数,用于在AF模块需要更新时通知用户进行相应处理。

3.2.5 HI_MPI_ISP_MemInit

  • 作用:初始化ISP的内存。
  • 细节:ISP需要使用内存进行图像处理操作,这个函数用于初始化ISP所需的内存,为后续的图像处理操作做准备。

3.2.6 HI_MPI_ISP_SetWDRMode

  • 作用:设置宽动态范围(WDR)模式。
  • 细节:宽动态范围功能用于在高对比度场景中捕获更清晰的图像,这个函数用于配置ISP的WDR模式,选择合适的WDR模式以适应当前的场景需求。

3.2.7 HI_MPI_ISP_SetPubAttr

  • 作用:设置ISP的公共属性。
  • 细节:公共属性包括图像的基本属性,如图像宽度、高度、帧率等,这个函数用于配置ISP的基本属性,为图像处理操作提供必要的参数。

3.2.8 HI_MPI_ISP_Init

  • 作用:初始化ISP。
  • 细节:这个函数用于初始化ISP模块,包括配置ISP的参数、启动ISP处理等,确保ISP可以正常工作,进行图像信号处理。ISP自己本身的一个初始化,把ISP系统整个初始化。

3.3 SAMPLE_COMM_ISP_RUN

  • 作用:运行ISP处理器。
  • 细节:在ISP初始化后,这个函数启动ISP的处理流程,使其开始处理来自MIPI摄像头的图像数据,进行各种图像处理操作。

3.4 SAMPLE_COMM_VI_StartDev

  • 作用:启动视频输入设备。
  • 细节:这个函数通常会初始化和启动视频输入设备(如摄像头模块)的硬件资源,使其准备好进行图像捕获。

HI3518E内部的ISP单元是隶属于VI模块的,VI模块就包含3大部分:第一部分是和sensor对接的部分,第二部分就是ISP,第三部分就是VI dev和channel,dev就是用来采集硬件的一个单元,channel就是通道,一个设备用来采集图像,采集到的图像它可以把它分为好几个道路,每个道路连接不同后续的处理流程。

3.4.1 HI_MPI_VI_SetDevAttr

  • 作用:设置视频输入(VI)设备的属性。
  • 细节:这个函数用于配置VI设备的各种属性,例如分辨率、帧率、扫描模式等。通过设置这些属性,可以确保VI设备按照期望的参数进行工作。

3.4.2 HI_MPI_ISP_GetWDRMode

  • 作用:获取当前ISP的宽动态范围(WDR)模式。
  • 细节:宽动态范围模式用于在高对比度场景中捕获更清晰的图像,这个函数可以获取当前ISP设置的WDR模式。

3.4.3 HI_MPI_VI_SetWDRAttr

  • 作用:设置视频输入(VI)设备的宽动态范围(WDR)属性。
  • 细节:这个函数用于设置VI设备的WDR属性,包括WDR模式、WDR增益等参数。

3.4.4 HI_MPI_VI_EnableDev

  • 作用:使能视频输入(VI)设备。
  • 细节:这个函数用于使能指定的VI设备,使其开始工作。通常在设置完VI设备的属性后,调用此函数以激活VI设备。

3.5 SAMPLE_COMM_VI_StartChn

  • 作用:启动视频输入通道。
  • 细节:在视频输入设备启动后,这个函数会启动具体的输入通道,使其开始接收和处理图像数据。通道配置通常包括图像分辨率、帧率、像素格式等。

3.5.1 HI_MPI_VI_SetChnAttr

  • 作用:设置视频输入通道的属性。
  • 细节:这个函数用于配置VI通道的各种属性,例如图像分辨率、像素格式、帧率等。通过设置这些属性,可以确保VI通道按照期望的参数进行工作。

3.5.2 HI_MPI_VI_SetRotate

  • 作用:设置视频输入通道的旋转属性。
  • 细节:这个函数用于设置VI通道的旋转角度。例如,可以将图像旋转90度、180度或270度,以适应不同的显示需求。

3.5.3 HI_MPI_VI_EnableChn

  • 作用:使能视频输入通道。
  • 细节:这个函数用于使能指定的VI通道,使其开始工作。通常在设置完VI通道的属性后,调用此函数以激活VI通道。

Step4 启动VPSS并进行绑定

第一步:先创建一路Group,把Group开启(4.2)

第二步:把Group与上一级VI里面dev里面的channel进行绑定(4.3)

第三步:绑定好之后,在VPSS内部创建几路自己所用的channel,将channel打开(4.4)

4.1 SAMPLE_COMM_SYS_GetPicSize

  • 作用:获取指定图像大小的宽度和高度。
  • 细节:这个函数用于根据指定的图像大小枚举值(例如1080P、720P等),获取对应的宽度和高度。通常用于初始化和配置系统时确定图像的分辨率。

enSize[0]:三路图像里面的第0路,咱们设置的是720P

4.2 SAMPLE_COMM_VPSS_StartGroup

  • 作用:启动视频处理子系统(VPSS)组。
  • 细节:这个函数用于启动一个VPSS组,VPSS组用于图像的缩放、裁剪、旋转等操作。启动VPSS组后,可以对图像进行各种处理。

4.2.1 HI_MPI_VPSS_CreateGrp

作用: 创建一个视频处理组(VPSS Group)。

函数原型:

HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, const VPSS_GRP_ATTR_S *pstGrpAttr);

参数:

  • VpssGrp: 视频处理组的标识符。
  • pstGrpAttr: 指向 VPSS 组属性结构体的指针,该结构体包含视频处理组的各种属性配置。

返回值: 返回 0 表示成功,其他值表示失败的错误代码。

4.2.2 HI_MPI_VPSS_GetNRParam

作用: 获取视频处理组的降噪参数。

函数原型:

HI_S32 HI_MPI_VPSS_GetNRParam(VPSS_GRP VpssGrp, VPSS_NR_PARAM_U *pstNrParam);

参数:

  • VpssGrp: 视频处理组的标识符。
  • pstNrParam: 指向用于存储降噪参数的结构体的指针。

返回值: 返回 0 表示成功,其他值表示失败的错误代码。

4.2.3 HI_MPI_VPSS_SetNRParam

作用: 设置视频处理组的降噪参数。

函数原型:

HI_S32 HI_MPI_VPSS_SetNRParam(VPSS_GRP VpssGrp, const VPSS_NR_PARAM_U *pstNrParam);

参数:

  • VpssGrp: 视频处理组的标识符。
  • pstNrParam: 指向包含新降噪参数的结构体的指针。

返回值: 返回 0 表示成功,其他值表示失败的错误代码。

4.2.4 HI_MPI_VPSS_StartGrp

作用: 启动视频处理组,使其开始处理视频帧。

函数原型:

HI_S32 HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp);

参数:

  • VpssGrp: 视频处理组的标识符。

返回值: 返回 0 表示成功,其他值表示失败的错误代码。

4.3 SAMPLE_COMM_VI_BindVpss

  • 作用:绑定视频输入(VI)设备到VPSS组。
  • 细节:这个函数用于将VI设备与VPSS组进行绑定,使得从VI设备捕获的视频数据可以直接输入到VPSS组进行处理。正是因为绑定,才是在线模式,不绑定就是离线模式,离线模式就是各自干各自的。(参考手册的2.2.3 VI和VPSS工作模式)

4.3.1 SAMPLE_COMM_VI_Mode2Param

作用

  • SAMPLE_COMM_VI_Mode2Param 函数用于将视频输入(VI)的模式转换为具体的参数配置。该函数通常根据传感器类型和视频输入模式设置相应的VI设备和通道的参数。

示例:

VI_DEV ViDev = 0;
VI_CHN ViChn = 0;
SAMPLE_VI_CONFIG_S stViConfig;
// 根据传感器类型设置VI设备和通道参数
SAMPLE_COMM_VI_Mode2Param(stViConfig.enViMode, &stViDevAttr, &stViChnAttr);

4.3.2 HI_MPI_SYS_Bind

作用

  • HI_MPI_SYS_Bind 函数用于绑定两个模块之间的通道。该函数通常用于将视频输入(VI)、视频处理子系统(VPSS)和视频编码(VENC)等模块连接起来,使数据能够在这些模块之间流动。

示例:

MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
// 设置源通道和目标通道
stSrcChn.enModId = HI_ID_VI;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = 0;
// 绑定VI通道和VPSS通道
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);

4.4 SAMPLE_COMM_VPSS_EnableChn

  • 作用:启用VPSS通道。
  • 细节:这个函数用于启用指定的VPSS通道。启用通道后,可以从VPSS组中获取处理后的图像数据。

4.4.1 HI_MPI_VPSS_SetChnAttr

作用

  • HI_MPI_VPSS_SetChnMode 函数用于设置视频处理子系统(VPSS)通道的工作模式。该函数可以配置VPSS通道是处于在线模式、离线模式还是低延迟模式等。

示例

VPSS_CHN VpssChn = 0;
VPSS_CHN_MODE_S stChnMode;
// 配置VPSS通道模式
stChnMode.enChnMode = VPSS_CHN_MODE_USER;
stChnMode.bDouble = HI_FALSE;
stChnMode.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
stChnMode.u32Width = 1920;
stChnMode.u32Height = 1080;
// 设置VPSS通道模式
HI_MPI_VPSS_SetChnMode(0, VpssChn, &stChnMode);

4.4.2 HI_MPI_VPSS_SetChnMode

作用

  • HI_MPI_VPSS_SetChnMode 函数用于设置视频处理子系统(VPSS)通道的工作模式。该函数可以配置VPSS通道是处于在线模式、离线模式还是低延迟模式等。

4.4.3 HI_MPI_VPSS_EnableChn

作用

  • HI_MPI_VPSS_EnableChn 函数用于启用视频处理子系统(VPSS)通道。该函数在设置好VPSS通道的属性和模式后,启用该通道以使其开始处理视频数据。

示例

VPSS_GRP VpssGrp = 0;
VPSS_CHN VpssChn = 0;
// 启用VPSS通道
HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);

Step5 启动video进行编码

第1路的编码,主要是通过if判断的:

可以看到,Vpss的通道0与Venc的通道0进行了绑定

第2路的编码:

Vpss的通道1与Venc的通道1进行了绑定

第3路:

Vpss的通道2与Venc的通道2进行了绑定

5.1 SAMPLE_COMM_VENC_Start

作用

用于启动视频编码(VENC)通道。这个函数通常封装了创建编码通道、设置编码参数、启动接收视频帧等操作。

示例代码
#include "sample_comm.h"

// 启动视频编码通道
HI_S32 SAMPLE_COMM_VENC_Start(VENC_CHN VencChn, PAYLOAD_TYPE_E enType, VIDEO_NORM_E enNorm, PIC_SIZE_E enSize, SAMPLE_RC_E enRcMode, HI_U32 u32Profile);

5.1.1 SAMPLE_COMM_SYS_GetPicSize

作用

根据给定的图片尺寸枚举值(PIC_SIZE_E),获取实际的图片尺寸(宽度和高度)。

示例代码
#include "sample_comm.h"

// 获取图片尺寸
HI_S32 SAMPLE_COMM_SYS_GetPicSize(PIC_SIZE_E enPicSize, SIZE_S* pstSize);

5.1.2 HI_MPI_VENC_CreateChn

作用

创建视频编码通道。这个函数用于创建一个新的编码通道,并设置相关的编码参数。

示例代码
#include "mpi_venc.h"

// 创建视频编码通道
HI_S32 HI_MPI_VENC_CreateChn(VENC_CHN VencChn, const VENC_CHN_ATTR_S* pstAttr);

5.1.3 HI_MPI_VENC_StartRecvPic

作用

启动视频编码通道接收视频帧。这个函数用于启动编码通道,使其开始接收视频帧进行编码。

示例代码
#include "mpi_venc.h"

// 启动视频编码通道接收视频帧
HI_S32 HI_MPI_VENC_StartRecvPic(VENC_CHN VencChn);

5.1.4 SAMPLE_COMM_VENC_BindVpss

作用

绑定视频处理子系统(VPSS)到视频编码通道。这个函数用于将VPSS输出的视频帧绑定到编码通道,使其可以进行编码处理。

示例代码
#include "sample_comm.h"

// 绑定VPSS到视频编码通道
HI_S32 SAMPLE_COMM_VENC_BindVpss(VENC_CHN VencChn, VPSS_GRP VpssGrp, VPSS_CHN VpssChn);
5.1.4.1 HI_MPI_SYS_Bind
作用

在系统层绑定两个模块。这个函数用于将一个模块的输出绑定到另一个模块的输入,使得数据可以在两个模块之间传递。

示例代码
#include "mpi_sys.h"

// 系统层绑定两个模块
HI_S32 HI_MPI_SYS_Bind(const MPP_CHN_S* pstSrcChn, const MPP_CHN_S* pstDestChn);

Step6 保存文件

6.1 SAMPLE_COMM_VENC_StartGetStream

作用

启动获取视频编码流的线程。这个函数通常封装了创建线程、从编码通道获取视频流并保存到文件等操作。

6.1.1 SAMPLE_COMM_VENC_GetVencStreamProc

作用

获取视频编码流处理过程。这个函数通常在获取视频流的线程中调用,用于从编码通道获取视频流并进行处理(如保存到文件)。

示例代码
#include "sample_comm.h"

// 获取视频编码流处理过程
HI_S32 SAMPLE_COMM_VENC_GetVencStreamProc(HI_VOID);
6.1.1.1 HI_MPI_VENC_GetChnAttr
作用

获取视频编码通道的属性。这个函数用于查询编码通道的当前属性,包括编码类型、分辨率、比特率等。

示例代码
#include "mpi_venc.h"

// 获取视频编码通道属性
HI_S32 HI_MPI_VENC_GetChnAttr(VENC_CHN VencChn, VENC_CHN_ATTR_S* pstAttr);
6.1.1.2 SAMPLE_COMM_VENC_GetFilePostfix
作用

获取视频编码文件的后缀名。这个函数根据编码类型返回对应的文件后缀名,如 .h264.h265 等。

示例代码
#include "sample_comm.h"

// 获取视频编码文件后缀名
HI_S32 SAMPLE_COMM_VENC_GetFilePostfix(PAYLOAD_TYPE_E enPayload, char* szFilePostfix);
6.1.1.3 HI_MPI_VENC_GetFd
作用

获取视频编码通道的文件描述符(File Descriptor, FD)。这个函数用于获取编码通道的文件描述符,以便使用 select 等系统调用进行事件通知。

示例代码
#include "mpi_venc.h"

// 获取视频编码通道文件描述符
HI_S32 HI_MPI_VENC_GetFd(VENC_CHN VencChn);
6.1.1.4 HI_MPI_VENC_Query

作用

  • HI_MPI_VENC_Query 函数用于查询视频编码通道(VENC)的状态。该函数可以获取编码通道当前的状态信息,包括编码通道是否有新的编码流数据可以获取。

示例

VENC_CHN VencChn = 0;
VENC_CHN_STATUS_S stStat;
// 查询编码通道状态
HI_S32 s32Ret = HI_MPI_VENC_Query(VencChn, &stStat);
if (s32Ret == HI_SUCCESS)
{
    printf("Encoded frames: %d, Available stream: %d\n", stStat.u32CurPacks, stStat.u32LeftStreamFrames);
}
6.1.1.5 HI_MPI_VENC_GetStream

作用

  • HI_MPI_VENC_GetStream 函数用于获取编码通道的编码流。该函数会将编码后的视频数据(如H.264或H.265格式)存储到指定的流缓冲区中。

示例

VENC_CHN VencChn = 0;
VENC_STREAM_S stStream;
// 获取编码流
HI_S32 s32Ret = HI_MPI_VENC_GetStream(VencChn, &stStream, HI_TRUE);
if (s32Ret == HI_SUCCESS)
{
    // 处理编码流
}
6.1.1.6 SAMPLE_COMM_VENC_SaveStream

作用

  • SAMPLE_COMM_VENC_SaveStream 函数用于将编码流保存到文件中。该函数通常用于将获取到的编码流数据写入磁盘文件,以便进行后续处理或存档。

示例

FILE *pFile = fopen("output.h264", "wb");
VENC_CHN VencChn = 0;
VENC_STREAM_S stStream;
// 获取编码流后保存到文件
if (HI_MPI_VENC_GetStream(VencChn, &stStream, HI_TRUE) == HI_SUCCESS)
{
    SAMPLE_COMM_VENC_SaveStream(pFile, &stStream);
}
fclose(pFile);
6.1.1.6.1 SAMPLE_COMM_VENC_SaveH264

作用

  • SAMPLE_COMM_VENC_SaveH264 函数是一个特定的保存函数,用于将H.264编码格式的流保存到文件中。该函数通常处理特定于H.264格式的细节,如NALU(Network Abstraction Layer Unit)的分割和写入。

示例

FILE *pFile = fopen("output.h264", "wb");
VENC_CHN VencChn = 0;
VENC_STREAM_S stStream;
// 获取编码流后保存到文件
if (HI_MPI_VENC_GetStream(VencChn, &stStream, HI_TRUE) == HI_SUCCESS)
{
    SAMPLE_COMM_VENC_SaveH264(pFile, &stStream);
}
fclose(pFile);
6.1.1.7 HI_MPI_VENC_ReleaseStream

作用

  • HI_MPI_VENC_ReleaseStream 函数用于释放编码通道的编码流。该函数在编码流数据处理完毕后调用,通知底层驱动该流缓冲区已不再使用,可以被重用。

示例

VENC_CHN VencChn = 0;
VENC_STREAM_S stStream;
// 获取编码流并处理后释放
if (HI_MPI_VENC_GetStream(VencChn, &stStream, HI_TRUE) == HI_SUCCESS)
{
    // 处理编码流
    HI_MPI_VENC_ReleaseStream(VencChn, &stStream);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值