3

我正在尝试使用 OpenH264 C++ 库为 960x540 视频每秒获得大约 24 帧。我为 SEncParamExt 尝试了不同的参数,但我无法获得更好的编解码器性能,而不是更小的编码数据。我在我的电脑上得到大约 16-20 fps。

这是我当前的配置。

SEncParamExt param;
m_pEncoder->GetDefaultParams(&param);

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.iComplexityModeparam.iRCMode尝试了不同的值,我得到了必要的帧速率,但图像质量非常差。我也玩过量化级别,但没有帮助。

我也使用VP8 编解码器。它可以轻松地为同一视频每秒生成 24 帧。编码的数据大小更大(大约每秒 500Kb 与每秒 200Kb 在 OpenH264 的情况下)但对我来说非常方便。

我究竟做错了什么?我应该怎么做才能提高 OpenH264 性能?

4

0 回答 0