4

opencv + H.264 についての質問が多いのですが、詳しい説明はありませんでした。

Visual Studioでopenh264(openh264-1.4.0-win32msvc.dll)とopencv 3.1(ffmpegを有効にしたcmakeのカスタムビルド)を使用しています.H.264圧縮でウェブカメラからのビデオをmp4形式で保存したかったのです

VideoWriter write = VideoWriter("D:/movie.mp4", CV_FOURCC('H', '2', '6', '4'), 10.0, cv::Size(192, 144), true);

openh264 を使用する前に、コンソール ウィンドウに "Failed to load openh264 library : openh264-1.4.0-win32msvc.dll please check your environment and/or download from here: https://github.com/cisco/ " という警告メッセージが表示されました。 openh264/releases " (動画も保存されていませんでした)

そのため、dll をダウンロードし、プログラム ファイル (exe) を含むフォルダーに保存しましたが、プログラムを実行すると、別のエラーが表示されます "[OpenH264] this = 0x0DE312C0, warning: bEnabledFrameSkip=0, bitrate can't be control RC_QUALITY_MODE および RC_TIMESTAMP_MODE でスキップ フレームを有効にしない場合" (現在、ビデオは保存されていますが、サイズが非常に大きくなっています! ビット レートは約 1200 Kbps です)

私にとって、h264 を使用する唯一の目的はファイル サイズを縮小することです。または、コードを介して何らかの方法でビットレートを下げる方法があるかどうか教えてください。

PS: CV_FOURCC() の代わりに -1 を指定してみました。システムに「インストールされたコーデック」ウィンドウが表示されました。ここからさまざまなコーデック パックと h264 をインストールしたにもかかわらず、h264、x264、または h264vfw が見つかりませんでした。

ありがとうございます。それでは、お元気で

4

2 に答える 2

2

ビットレートを制御したい場合は、両方を使用する必要があります

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);

それがあなたを助けることを願っています。

于 2016-07-19T09:06:52.420 に答える
1

RC_BITRATE_MODE を使用し、Openh264 で bEnableFrameSkip を有効にすることで、簡単にビット レートを制御できます。

于 2016-07-19T06:29:35.880 に答える