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 の場合は毎秒 200Kb に対して約 500Kb です) が、私にとっては非常に便利です。
私は何を間違っていますか?OpenH264 のパフォーマンスを向上させるにはどうすればよいですか?