Я пытаюсь получить около 24 кадров в секунду для видео 960×540 с использованием библиотеки OpenH264 C ++. Я пробовал разные параметры для SEncParamExt, и я не могу получить лучшую производительность кодека вместо кодированных данных меньшего размера. Я получаю около 16-20 кадров в секунду на моем компьютере.
Вот мой текущий конфиг.
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 кадра в секунду для одного и того же видео. Размер закодированных данных больше (около 500 Кб / с против 200 Кб / с в случае OpenH264), но для меня это очень удобно.
Что я делаю неправильно? Что я должен сделать, чтобы увеличить производительность OpenH264?
Задача ещё не решена.
Других решений пока нет …