openh264 - bEnableFrameSkip = 0, битрейт не контролируется

есть много вопросов относительно opencv + H.264, но ни один из них не дал подробного объяснения.

Я использую openh264 (openh264-1.4.0-win32msvc.dll) вместе с opencv 3.1 (настраиваемая сборка с cmake с включенным ffmpeg) в Visual Studio я хотел сохранить видео, поступающее с веб-камеры, в формате mp4 со сжатием H.264

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/Release" (также видео не было сохранено)

поэтому я загрузил dll и теперь храню в папке с моим программным файлом (exe), когда я запускаю программу, я вижу другую ошибку "[OpenH264] this = 0x0DE312C0, предупреждение: bEnabledFrameSkip = 0, битрейт невозможно контролировать для RC_QUALITY_MODE и RC_TIMESTAMP_MODE без включения пропуска кадра "(теперь видео сохраняется, но размер очень высокий! скорость передачи данных составляет около 1200 Кбит / с)

для меня единственная цель использования h264 - уменьшить размер файла ... я думаю, что мне, возможно, придется самому собрать openh264 с некоторыми изменениями, чтобы удалить эту ошибку, может ли кто-нибудь посоветовать мне, как? или подскажите, есть ли способ как-то снизить битрейт с помощью кода?

PS: Я попытался дать -1 вместо CV_FOURCC (), в моей системе появилось окно «установленные кодеки», я не смог найти h264, x264 или h264vfw, хотя я установил различные пакеты кодеков и h264 из здесь

С уважением


person Prakash M    schedule 10.04.2016    source источник


Ответы (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);

Надеюсь, это поможет тебе.

person RajibTheKing    schedule 19.07.2016
comment
Спасибо за подробный ответ, я думаю, что для этого кода мне придется добавить библиотеки openh264 и включить файлы в Visual Studio. как этого добиться? Мне нужно самому создавать библиотеки open264 или я могу получить предварительно скомпилированные библиотеки для Windows. Я ищу, но мало получаю. попробовал это, но это не сработало (сбой сборки в Visual Studio ) есть ли у вас какие-нибудь полезные ссылки? Спасибо - person Prakash M; 19.07.2016
comment
Вы должны собрать Openh264 с помощью Visual Studio: i) Загрузите исходный код OpenH264, предоставленный cisco. Ii) Вы найдете совместимый с Visual Studio проект / OpenH264 / codec / build / win32 / dec и / OpenH264 / codec / build / win32 / enc. iii) Вам нужно будет загрузить программное обеспечение NASM. iv) Затем добавьте путь к исполняемому файлу NASM для всех этих проектов Visual Studio. v) Затем вы можете выбрать статическую или динамическую библиотеку в общих параметрах. vi) Наконец, у вас будет 5 разных файлов проекта .lib или .dll, которые можно использовать в любых проектах Visual Studio. - person RajibTheKing; 20.07.2016
comment
Как ввести имя файла видео video_file.mp4 вencoderParemeters? Если не в encoderParemeters, где еще я могу сказать кодировщику, что это мой видеофайл, в который нужно кодировать данные. @RajibTheKing Не могли бы вы взглянуть на мой вопрос здесь . Очень похоже на настройку кодировщика в OpenH264. заранее спасибо - person TheWaterProgrammer; 16.10.2017

Вы можете просто контролировать скорость передачи данных с помощью RC_BITRATE_MODE и включения bEnableFrameSkip в Openh264.

person fahad_sust    schedule 19.07.2016
comment
Спасибо за ответ. Раньше я не использовал Openh264. как я уже сказал в вопросе, я только что скопировал файл dll в исполняемый каталог .. так что я думаю, чтобы включить фрейм bEnableSkip, мне нужно будет включить файлы заголовков open264 и статические библиотеки в проект Visual Studio? какие-нибудь полезные ссылки для этого? попробовал это, но не работал (сбой сборки в Visual Studio) Спасибо - person Prakash M; 19.07.2016