Как назначить уровень видео для структурирования AVCodecContext в ffmpeg? - PullRequest
0 голосов
/ 14 июня 2019

Я пишу API кодирования видео на C ++ с помощью ffmpeg. Уровень видео является одним важным параметром, но я не знаю, как назначить его AVCodecContext.

Я прочитал документ ffmpeg и выяснил, что"level" - это тип int, ниже - определение в строке 3014 файла avcodec.h.

           /**
 3010      * level
 3011      * - encoding: Set by user.
 3012      * - decoding: Set by libavcodec.
 3013      */
 3014      int level;
 3015 #define FF_LEVEL_UNKNOWN -99

, согласно моему поиску в Google, значение level равно 1.1 (1.2,1.3,2 ...) до 5.2, очевидно, это не тип int.Я думаю, что уровень должен быть типом enum, но я не могу найти какое-либо определение по этому поводу.

Я вижу некоторое использование в Интернете, такое как:

  AVCodecContect *pCtx;
  pCtx->level = 3;
  ....//or 
  pCtx->level = 50;

, но я думаю, что этонеправильное использование ... Я думаю, что правильный способ присвоения выглядит примерно так:

  pCtx->level = FF_LEVEL_UNKNOWN;

, поэтому мне интересно, есть ли какое-нибудь соответствующее определение типа enum относительно уровня и как его найти.

1 Ответ

1 голос
/ 14 июня 2019

Предполагается, что вы кодируете видео по стандарту H.264.Указав уровень FF_LEVEL_UNKNOWN, кодировщик выберет подходящий для вас уровень.Как правило, это лучший выбор.

Но если по каким-то причинам вам нужно самостоятельно определить уровень, просто умножьте реальный уровень (который может быть 1,1 или 3,1 и т. Д.) На 10. Подробные инструкции приведены вRecommendation ITU-T H.264, Annex A.3 о том, как выбрать уровень.И вы также можете узнать их в коде кодировщиков.Как и x264, код находится по адресу encoder.c:

const x264_level_t *l = x264_levels;
if( h->param.i_level_idc < 0 )
{
    int maxrate_bak = h->param.rc.i_vbv_max_bitrate;
    if( h->param.rc.i_rc_method == X264_RC_ABR && h->param.rc.i_vbv_buffer_size <= 0 )
        h->param.rc.i_vbv_max_bitrate = h->param.rc.i_bitrate * 2;
    x264_sps_init( h->sps, h->param.i_sps_id, &h->param );
    do h->param.i_level_idc = l->level_idc;
        while( l[1].level_idc && x264_validate_levels( h, 0 ) && l++ );
    h->param.rc.i_vbv_max_bitrate = maxrate_bak;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...