我试图使用OpenH264 C ++库为960x540视频获得大约每秒24帧的速度。我为SEncParamExt尝试了不同的参数,我无法获得更好的编解码器性能,而不是更小的编码数据。我的计算机上的速度大约为16-20 fps。
这是我目前的配置。
SEncParamExt param;
m_pEncoder->GetDefaultParams(¶m);
param.fMaxFrameRate = 30;
param.bEnableFrameSkip = false;
param.iMinQp = 20;
param.iMaxQp = 30;
param.iPicWidth = m_frameFormat.GetWidth();
param.iPicHeight = m_frameFormat.GetHeight();
param.iTargetBitrate = 5000000;
param.bEnableDenoise = false;
param.iSpatialLayerNum = 1;
param.iTemporalLayerNum = 1;
param.bIsLosslessLink = false;
param.bEnableLongTermReference = true;
param.iEntropyCodingModeFlag = 0;
param.iMultipleThreadIdc = 2;
param.bUseLoadBalancing = true;
for (int i = 0; i < param.iSpatialLayerNum; i++)
{
param.sSpatialLayers[i].iVideoWidth = m_frameFormat.GetWidth() >> (param.iSpatialLayerNum - 1 - i);
param.sSpatialLayers[i].iVideoHeight = m_frameFormat.GetHeight() >> (param.iSpatialLayerNum - 1 - i);
param.sSpatialLayers[i].fFrameRate = 30;
param.sSpatialLayers[i].iSpatialBitrate = param.iTargetBitrate;
param.sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
param.sSpatialLayers[i].sSliceArgument.uiSliceNum = 2;
}
param.iTargetBitrate *= param.iSpatialLayerNum;
我为 param.iComplexityMode 和 param.iRCMode 尝试了不同的值,我得到了必要的帧速率,但图片质量非常糟糕。我也玩过量化等级而且没有帮助。
我也使用 VP8编解码器。它可以轻松地为同一视频生成每秒24帧。编码数据的大小更大(在OpenH264的情况下,大约每秒500Kb,而在每秒200Kb),但对我来说非常方便。
我做错了什么?我该怎么做才能提高OpenH264的性能?