opencv + H.264に関して多くの質問がありますが、詳細な説明はありませんでした。
VisualStudioでopenh264(openh264-1.4.0-win32msvc.dll)とopencv 3.1(ffmpegを有効にしたcmakeを使用したカスタムビルド)を使用していますが、WebサイトからのビデオをH.264圧縮のmp4形式で保存したいと思いました。
VideoWriter write = VideoWriter( "D:/movie.mp4"、CV_FOURCC( 'H'、 '2'、 '6'、 '4')、10.0、cv :: Size(192、144)、true);
openh264を使用する前に、コンソールウィンドウに「openh264ライブラリの読み込みに失敗しました:openh264-1.4.0-win32msvc.dll環境を確認するか、https://github.com/cisco/からダウンロードしてください」という警告メッセージが表示されていました。openh264 / releases "(ビデオも保存されませんでした)
そのため、dllをダウンロードして、プログラムファイル(exe)と一緒にフォルダーに保存しました。プログラムを実行すると、別のエラーが表示されます。 "[OpenH264] this = 0x0DE312C0、warning:bEnabledFrameSkip = 0、bitrate ca n't controlスキップフレームを有効にしないRC_QUALITY_MODEおよびRC_TIMESTAMP_MODEの場合」(ビデオは保存されますが、サイズが非常に大きくなります。ビットレートは約1200 Kbpsです)
私にとって、h264を使用する唯一の目的は、ファイルサイズを小さくすることです。このエラーを削除するために、いくつかの変更を加えてopenh264を自分でビルドする必要があると思います。または、コードを使用してビットレートを下げる方法があるかどうか教えてください。
PS:CV_FOURCC()の代わりに-1を指定しようとすると、システムに「インストールされたコーデック」ウィンドウが表示されました。ここからさまざまなコーデックパックとh264をインストールしたにもかかわらず、h264、x264、またはh264vfwが見つかりませんでした。
ありがとうございます。それでは、お元気で
ビットレートを制御したい場合は、両方を使用する必要があります
encoderParemeters.iRCMode = RC_OFF_MODE;
encoderParemeters.bEnableFrameSkip = true;
ここでは、例としてすべてのOpenh264エンコーディングパラメータを示しています。
long nReturnedValueFromEncoder = WelsCreateSVCEncoder(&m_pSVCVideoEncoder);
m_nVideoWidth = 352;
m_nVideoHeight = 288;
SEncParamExt encoderParemeters;
memset(&encoderParemeters, 0, sizeof(SEncParamExt));
m_pSVCVideoEncoder->GetDefaultParams(&encoderParemeters);
encoderParemeters.iUsageType = CAMERA_VIDEO_REAL_TIME;
encoderParemeters.iTemporalLayerNum = 0;
encoderParemeters.uiIntraPeriod = 15;
encoderParemeters.eSpsPpsIdStrategy = INCREASING_ID;
encoderParemeters.bEnableSSEI = false;
encoderParemeters.bEnableFrameCroppingFlag = true;
encoderParemeters.iLoopFilterDisableIdc = 0;
encoderParemeters.iLoopFilterAlphaC0Offset = 0;
encoderParemeters.iLoopFilterBetaOffset = 0;
encoderParemeters.iMultipleThreadIdc = 0;
encoderParemeters.iRCMode = RC_BITRATE_MODE;
encoderParemeters.iMinQp = 0;
encoderParemeters.iMaxQp = 52;
encoderParemeters.bEnableDenoise = false;
encoderParemeters.bEnableSceneChangeDetect = false;
encoderParemeters.bEnableBackgroundDetection = true;
encoderParemeters.bEnableAdaptiveQuant = false;
encoderParemeters.bEnableFrameSkip = true;
encoderParemeters.bEnableLongTermReference = true;
encoderParemeters.iLtrMarkPeriod = 20;
encoderParemeters.bPrefixNalAddingCtrl = false;
encoderParemeters.iSpatialLayerNum = 1;
SSpatialLayerConfig *spartialLayerConfiguration = &encoderParemeters.sSpatialLayers[0];
spartialLayerConfiguration->uiProfileIdc = PRO_BASELINE;//;
encoderParemeters.iPicWidth = spartialLayerConfiguration->iVideoWidth = m_nVideoWidth;
encoderParemeters.iPicHeight = spartialLayerConfiguration->iVideoHeight = m_nVideoHeight;
encoderParemeters.fMaxFrameRate = spartialLayerConfiguration->fFrameRate = (float)30;
encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iSpatialBitrate = 500000;
encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iMaxSpatialBitrate = 500000;
spartialLayerConfiguration->iDLayerQp = 24;
//spartialLayerConfiguration->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
spartialLayerConfiguration->sSliceArgument.uiSliceMode = SM_SINGLE_SLICE;
nReturnedValueFromEncoder = m_pSVCVideoEncoder->InitializeExt(&encoderParemeters);
それがあなたを助けることを願っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加