openh264 编码参数详细介绍

openh264

OpenH264 是 Cisco 开源的一个 H.264 编码器,它支持 H.264 高级视频编码标准。这个编码器库适用于实时通信和流媒体应用,如 WebRTC,并且它是完全免费和开源的。OpenH264 项目在 GitHub 上进行维护,并且有一个活跃的社区,为开发者提供了丰富的文档和示例代码。

TagEncParamBase参数结构体

(SEncParamBase, *PEncParamBase)

  • 说明:基础编码参数结构体
  • EUsageType iUsageType
    • 编码器使用类型,参考EUsageType的定义,主要有相机实时、桌面内容、相机非实时、桌面内容非实时、输入内容所有类型一共五种类型;
/**
* @brief Encoder usage type
*/
typedef enum {
  CAMERA_VIDEO_REAL_TIME,      ///< camera video for real-time communication
  SCREEN_CONTENT_REAL_TIME,    ///< screen content signal
  CAMERA_VIDEO_NON_REAL_TIME,
  SCREEN_CONTENT_NON_REAL_TIME,
  INPUT_CONTENT_TYPE_ALL,
} EUsageType;
  • int iPicWidth
    • 亮度采样的图像宽,如果有多个空域层,则为最大值
  • int iPicHeight
    • 亮度采样的图像高,如果有多个空域层,则为最大值
  • int iTargetBitrate
    • 期望的目标比特率,单位是 bps
  • RC_MODES iRCMode
    • 码率控制方式,可以参考RC_MODES中定义,主要有质量模式、码率模式、自适应质量模式、基于时间戳模式、内置 rc 模式、关闭 rc 模式。
/**
* @brief Enumerate the type of rate control mode
*/
typedef enum {
  RC_QUALITY_MODE = 0,     ///< quality mode
  RC_BITRATE_MODE = 1,     ///< bitrate mode
  RC_BUFFERBASED_MODE = 2, ///< no bitrate control,only using buffer status,adjust the video quality
  RC_TIMESTAMP_MODE = 3, //rate control based timestamp
  RC_BITRATE_MODE_POST_SKIP = 4, ///< this is in-building RC MODE, WILL BE DELETED after algorithm tuning!
  RC_OFF_MODE = -1,         ///< rate control off mode
} RC_MODES;
  • float fMaxFrameRate
    • 最大输入帧率

TagEncParamExt参数结构体

(SEncParamExt)

  • 说明:扩展编码参数结构体
  • EUsageType iUsageType
    • 同TagEncParamBase
  • int iPicWidth
    • 同TagEncParamBase
  • int iPicHeight
    • 同TagEncParamBase
  • int iTargetBitrate
    • 同TagEncParamBase
  • RC_MODES iRCMode
    • 同TagEncParamBase
  • float fMaxFrameRate
    • 同TagEncParamBase
  • int iTemporalLayerNum
    • 时域分层数,最大时域层等于 4
  • int iSpatialLayerNum
    • 空域分层数,取值在 1~MAX_SPATIAL_LAYER_NUM,其中MAX_SPATIAL_LAYER_NUM取值 4
  • SSpatialLayerConfig sSpatialLayers[MAX_SPATIAL_LAYER_NUM]
    • 空域层配置,最大 4 层,为不同的空域层配置编码相关参数,具体可以参考SSpatialLayerConfig结构体
/**
* @brief  Structure for spatial layer configuration
*/
typedef struct {
  int   iVideoWidth;           ///< width of picture in luminance samples of a layer
  int   iVideoHeight;          ///< height of picture in luminance samples of a layer
  float fFrameRate;            ///< frame rate specified for a layer
  int   iSpatialBitrate;       ///< target bitrate for a spatial layer, in unit of bps
  int   iMaxSpatialBitrate;    ///< maximum  bitrate for a spatial layer, in unit of bps
  EProfileIdc  uiProfileIdc;   ///< value of profile IDC (PRO_UNKNOWN for auto-detection)
  ELevelIdc    uiLevelIdc;     ///< value of profile IDC (0 for auto-detection)
  int          iDLayerQp;      ///< value of level IDC (0 for auto-detection)

  SSliceArgument sSliceArgument;

  // Note: members bVideoSignalTypePresent through uiColorMatrix below are also defined in SWelsSPS in parameter_sets.h.
  bool      bVideoSignalTypePresent;  // false => do not write any of the following information to the header
  unsigned char
  uiVideoFormat;        // EVideoFormatSPS; 3 bits in header; 0-5 => component, kpal, ntsc, secam, mac, undef
  bool      bFullRange;         // false => analog video data range [16, 235]; true => full data range [0,255]
  bool      bColorDescriptionPresent; // false => do not write any of the following three items to the header
  unsigned char
  uiColorPrimaries;     // EColorPrimaries; 8 bits in header; 0 - 9 => ???, bt709, undef, ???, bt470m, bt470bg,
  //    smpte170m, smpte240m, film, bt2020
  unsigned char
  uiTransferCharacteristics;  // ETransferCharacteristics; 8 bits in header; 0 - 15 => ???, bt709, undef, ???, bt470m, bt470bg, smpte170m,
  //   smpte240m, linear, log100, log316, iec61966-2-4, bt1361e, iec61966-2-1, bt2020-10, bt2020-12
  unsigned char
  uiColorMatrix;        // EColorMatrix; 8 bits in header (corresponds to FFmpeg "colorspace"); 0 - 10 => GBR, bt709,
  //   undef, ???, fcc, bt470bg, smpte170m, smpte240m, YCgCo, bt2020nc, bt2020c

  bool bAspectRatioPresent; ///< aspect ratio present in VUI
  ESampleAspectRatio eAspectRatio; ///< aspect ratio idc
  unsigned short sAspectRatioExtWidth; ///< use if aspect ratio idc == 255
  unsigned short sAspectRatioExtHeight; ///< use if aspect ratio idc == 255

} SSpatialLayerConfig;
  • ECOMPLEXITY_MODE iComplexityMode
    • 复杂度模式,用来平衡编码复杂度和编码质量,具体可参考ECOMPLEXITY_MODE 共用体,取值有LOW_COMPLEXITY、MEDIUM_COMPLEXITY、HIGH_COMPLEXITY三种模式
/**
* @brief Enumulate the complexity mode
*/
typedef enum {
  LOW_COMPLEXITY = 0,              ///< the lowest compleixty,the fastest speed,
  MEDIUM_COMPLEXITY,          ///< medium complexity, medium speed,medium quality
  HIGH_COMPLEXITY             ///< high complexity, lowest speed, high quality
} ECOMPLEXITY_MODE;
  • unsigned int uiIntraPeriod
    • 帧内编码帧的间隔,即 GOP 长度
  • int iNumRefFrame
    • 被使用的参考帧的数量
  • EParameterSetStrategy eSpsPpsIdStrategy
    • 在不同的 ID 中SPS/PPS 使用不同的策略,具体可以参考EParameterSetStrategy中定义,主要有固定 ID、每个 IDR 帧增加 ID、使用现有的 sps、使用现有 sps 同时 pps 增加、使用现有的 sps、pps。
/**
 * @brief Enumulate for the stategy of SPS/PPS strategy
 */
typedef enum {
  CONSTANT_ID = 0,           ///< constant id in SPS/PPS
  INCREASING_ID = 0x01,      ///< SPS/PPS id increases at each IDR
  SPS_LISTING  = 0x02,       ///< using SPS in the existing list if possible
  SPS_LISTING_AND_PPS_INCREASING  = 0x03,
  SPS_PPS_LISTING  = 0x06,
} EParameterSetStrategy;
  • bool bPrefixNalAddingCtrl
    • false 不使用Prefix NAL,true 使用Prefix NAL
    • Prefix NAL(前缀NAL单元)是视频编码中,特别是在H.264/AVC标准里使用的一种技术。它是一种特定的NAL单元,用于在发送新的NAL单元之前提供一些额外的信息或控制指令。这种前缀可以包含重要的编码参数,比如时间戳信息、解码参数集合(如SPS和PPS)的变化信息等。
  • bool bEnableSSEI
    • false 不使用 SSEI,true 使用 SSEI,todo:计划移除 SSEI 接口
  • bool bSimulcastAVC
    • false 使用 svc 语法为更高层当空域层多于 1 层时,true 使用Simulcast avc
  • int iPaddingFlag
    • 0 不填充,1 填充,
  • int iEntropyCodingModeFlag
    • 熵编码方式,0 为 cavlc,1 为 cabac
  • bool bEnableFrameSkip
    • false 无法跳帧,即使 vbv缓存溢出,true 允许跳帧保持码率在限制范围内
  • int iMaxBitrate
    • 最大码率,单位是 bps,如果不需要设置为UNSPECIFIED_BIT_RATE
  • int iMaxQp
    • 编码器支持的最大 qp 值
  • int iMinQp
    • 编码器支持的最小 qp 值
  • unsigned int uiMaxNalSize
    • 最大 NAL 大小,对于动态切片模式,该值不应该为0
  • bool bEnableLongTermReference
    • 长参考开关,1 开启长参考,0 关闭长参考
  • int iLTRRefNum
    • 长参考帧数量,todo:还不支持任意设置
  • unsigned int iLtrMarkPeriod
    • 在反馈中标记长参考的间隔周期
  • unsigned short iMultipleThreadIdc
    • 多线程设置,0 auto, 1 禁用多线程,大于 1 时计数多线程数量
  • bool bUseLoadBalancing
    • 仅当uiSliceMode=1或3时使用,将在多线程编码的运行期间更改图片的切片,因此每次运行的结果可能不同
  • int iLoopFilterDisableIdc
    • 去块环路滤波器,0:开启,1:关闭,2:开启,除了切片边界
  • int iLoopFilterAlphaC0Offset
    • Alpha偏移量设置,取值范围[-6, 6],默认 0
  • int iLoopFilterBetaOffset
    • Beta偏移量设置,取值范围[-6, 6],默认 0
  • bool bEnableDenoise
    • 去噪控制
  • bool bEnableBackgroundDetection
    • 背景检测控制
  • bool bEnableAdaptiveQuant
    • 自适应量化控制
  • bool bEnableFrameCroppingFlag
    • 使能帧裁剪标志:在应用中始终为TRUE
  • bool bEnableSceneChangeDetect
    • 场景变化检测
  • bool bIsLosslessLink
    • 长参考高级设置

编码参数默认设置

  • 在 param_svc.h 文件中FillDefault (SEncParamExt& param)函数设置编码参数默认值。
static void FillDefault (SEncParamExt& param) {
    memset (&param, 0, sizeof (param));
    param.uiIntraPeriod         = 0;                    // intra period (multiple of GOP size as desired)
    param.iNumRefFrame          = AUTO_REF_PIC_COUNT;// number of reference frame used

    param.iPicWidth             = 0;    //   actual input picture width
    param.iPicHeight            = 0;    //   actual input picture height

    param.fMaxFrameRate         = MAX_FRAME_RATE;       // maximal frame rate [Hz / fps]

    param.iComplexityMode       = LOW_COMPLEXITY;
    param.iTargetBitrate        = UNSPECIFIED_BIT_RATE; // overall target bitrate introduced in RC module
    param.iMaxBitrate           = UNSPECIFIED_BIT_RATE;
    param.iMultipleThreadIdc    = 1;
    param.bUseLoadBalancing = true;

    param.iLTRRefNum            = 0;
    param.iLtrMarkPeriod        = 30;   //the min distance of two int32_t references

    param.bEnableSSEI           = false;
    param.bSimulcastAVC         = false;
    param.bEnableFrameCroppingFlag = true; // enable frame cropping flag: true alwayse in application
    // false: Streaming Video Sharing; true: Video Conferencing Meeting;

    /* Deblocking loop filter */
    param.iLoopFilterDisableIdc         = 0;    // 0: on, 1: off, 2: on except for slice boundaries
    param.iLoopFilterAlphaC0Offset      = 0;    // AlphaOffset: valid range [-6, 6], default 0
    param.iLoopFilterBetaOffset         = 0;    // BetaOffset:  valid range [-6, 6], default 0

    /* Rate Control */
    param.iRCMode                       = RC_QUALITY_MODE;
    param.iPaddingFlag                  = 0;
    param.iEntropyCodingModeFlag        = 0;
    param.bEnableDenoise                = false;        // denoise control
    param.bEnableSceneChangeDetect      = true;         // scene change detection control
    param.bEnableBackgroundDetection    = true;         // background detection control
    param.bEnableAdaptiveQuant          = true;         // adaptive quantization control
    param.bEnableFrameSkip              = true;         // frame skipping
    param.bEnableLongTermReference      = false;        // long term reference control
    param.eSpsPpsIdStrategy             = INCREASING_ID;// pSps pPps id addition control
    param.bPrefixNalAddingCtrl          = false;        // prefix NAL adding control
    param.iSpatialLayerNum              = 1;            // number of dependency(Spatial/CGS) layers used to be encoded
    param.iTemporalLayerNum             = 1;            // number of temporal layer specified

    param.iMaxQp = QP_MAX_VALUE;
    param.iMinQp = QP_MIN_VALUE;
    param.iUsageType = CAMERA_VIDEO_REAL_TIME;
    param.uiMaxNalSize = 0;
    param.bIsLosslessLink = false;
    for (int32_t iLayer = 0; iLayer < MAX_SPATIAL_LAYER_NUM; iLayer++) {
      param.sSpatialLayers[iLayer].uiProfileIdc = PRO_UNKNOWN;
      param.sSpatialLayers[iLayer].uiLevelIdc = LEVEL_UNKNOWN;
      param.sSpatialLayers[iLayer].iDLayerQp = SVC_QUALITY_BASE_QP;
      param.sSpatialLayers[iLayer].fFrameRate = param.fMaxFrameRate;

      param.sSpatialLayers[iLayer].iMaxSpatialBitrate = UNSPECIFIED_BIT_RATE;

      param.sSpatialLayers[iLayer].sSliceArgument.uiSliceMode = SM_SINGLE_SLICE;
      param.sSpatialLayers[iLayer].sSliceArgument.uiSliceNum = 0; //AUTO, using number of CPU cores
      param.sSpatialLayers[iLayer].sSliceArgument.uiSliceSizeConstraint = 1500;

      param.sSpatialLayers[iLayer].bAspectRatioPresent = false; // do not write any of the following information to the header
      param.sSpatialLayers[iLayer].eAspectRatio = ASP_UNSPECIFIED;
      param.sSpatialLayers[iLayer].sAspectRatioExtWidth = 0;
      param.sSpatialLayers[iLayer].sAspectRatioExtHeight = 0;

      const int32_t kiLesserSliceNum = ((MAX_SLICES_NUM < MAX_SLICES_NUM_TMP) ? MAX_SLICES_NUM : MAX_SLICES_NUM_TMP);
      for (int32_t idx = 0; idx < kiLesserSliceNum; idx++)
        param.sSpatialLayers[iLayer].sSliceArgument.uiSliceMbNum[idx] = 0; //default, using one row a slice if uiSliceMode is SM_RASTER_MODE

      // See codec_app_def.h for more info about members bVideoSignalTypePresent through uiColorMatrix.  The default values
      // used below preserve the previous behavior; i.e., no additional information will be written to the output file.
      param.sSpatialLayers[iLayer].bVideoSignalTypePresent = false;     // do not write any of the following information to the header
      param.sSpatialLayers[iLayer].uiVideoFormat = VF_UNDEF;        // undefined
      param.sSpatialLayers[iLayer].bFullRange = false;            // analog video data range [16, 235]
      param.sSpatialLayers[iLayer].bColorDescriptionPresent = false;    // do not write any of the following three items to the header
      param.sSpatialLayers[iLayer].uiColorPrimaries = CP_UNDEF;       // undefined
      param.sSpatialLayers[iLayer].uiTransferCharacteristics = TRC_UNDEF; // undefined
      param.sSpatialLayers[iLayer].uiColorMatrix = CM_UNDEF;        // undefined
    }
  }
OpenH264 是思科公司发布的一个开源的 H.264 编码和解码器。编码器特性Constrained Baseline Profile up to Level 5.2 (4096x2304)Arbitrary resolution, not constrained to multiples of 16x16Rate control with adaptive quantization, or constant quantizationSlice options: 1 slice per frame, N slices per frame, N macroblocks per slice, or N bytes per sliceMultiple threads automatically used for multiple slicesTemporal scalability up to 4 layers in a dyadic hierarchySpatial simulcast up to 4 resolutions from a single inputLong Term Reference (LTR) framesMemory Management Control Operation (MMCO)Reference picture list modificationSingle reference frame for inter predictionMultiple reference frames when using LTR and/or 3-4 temporal layersPeriodic and on-demand Instantaneous Decoder Refresh (IDR) frame insertionDynamic changes to bit rate, frame rate, and resolutionAnnex B byte stream outputYUV 4:2:0 planar input解码器特性Constrained Baseline Profile up to Level 5.2 (4096x2304)Arbitrary resolution, not constrained to multiples of 16x16Single thread for all slicesLong Term Reference (LTR) framesMemory Management Control Operation (MMCO)Reference picture list modificationMultiple reference frames when specified in Sequence Parameter Set (SPS)Annex B byte stream inputYUV 4:2:0 planar output支持的操作系统Windows 64-bit and 32-bit (initial release is only 32-bit, 64-bit will follow soon)Mac OS X 64-bit (initial release does not include this target, will follow soon)Linux 64-bit and 32-bit (initial release is only 32-bit, 64-bit will follow soon)Android 32-bit (initial release does not include this target, will follow soon)iOS 64-bit and 32-bit (not supported yet, may be added in the future)支持的处理器Intel x86 optionally with MMX/SSE (no AVX yet, help is welcome)ARMv7 optionally with NEON (initial release does not include this target, will follow later)Any architecture using C/C fallback functions 标签:OpenH264
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码流怪侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值