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 (¶m, 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
}
}