Как установить базовый профиль x264 с помощью libav в C++

Я пишу небольшой инструмент, который конвертирует видео в необработанный файл h264. Эти файлы должны быть воспроизведены позже на SIP-телефоне. У меня есть следующий код:

  eccx->pix_fmt = PIX_FMT_YUV420P;
  eccx->width = VIDEO_FRAME_WIDTH;
  eccx->height = VIDEO_FRAME_HEIGHT;
  eccx->time_base.num = 1;
  eccx->time_base.den = VIDEO_FRAMES_PER_SEC;
  eccx->max_b_frames = 0;

  eccx->rtp_payload_size = VIDEO_RTP_PAYLOAD_SIZE;

  eccx->bit_rate = VIDEO_BIT_RATE;
  eccx->rc_max_rate = VIDEO_BIT_RATE;
  eccx->rc_buffer_size = VIDEO_BIT_RATE * 2;

  eccx->flags |= CODEC_FLAG_QP_RD;
  eccx->flags |= CODEC_FLAG_LOW_DELAY;
  eccx->flags |= CODEC_FLAG_QSCALE;
  eccx->flags |= CODEC_FLAG_EMU_EDGE;

  eccx->mb_decision = FF_MB_DECISION_SIMPLE;

  switch(video){
  case H263:
    break;
  case H263P:
    eccx->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
    break;
  case H264:
    av_dict_set(&options, "vprofile", "baseline", 0);
    eccx->flags2 = CODEC_FLAG2_FASTPSKIP;
    eccx->profile = FF_PROFILE_H264_BASELINE;
    eccx->level = 13;
    break;
  }

Когда я запускаю эту программу, я получаю следующий вывод от libx264:

[libx264 @ 0x10fad60] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64
[libx264 @ 0x10fad60] profile Main, level 1.3

Почему это все еще основной профиль, хотя я явно установил его в качестве базового?

Кроме того, было бы очень здорово, если бы кто-то мог добавить несколько заметок о том, какие настройки h264 полезны для телефонных звонков SIP. Большое спасибо!


person Denis Loh    schedule 12.04.2013    source источник
comment
Что такое VIDEO_FRAME_WIDTH и VIDEO_FRAME_HEIGHT? Возможно ли, что эти разрешения слишком высоки?   -  person Dundar    schedule 11.10.2013
comment
Профиль не зависит от уровня. Уровень ограничивает размер кадра. Уровень 1.3 позволяет использовать кадры до CIF (en.wikipedia.org/wiki/H264#Levels). Входной видеопоток имеет формат CIF. Входное видео может содержать B-кадры, которые не разрешены в Baseline, но как убедить libav преобразовать их в I- или P-кадры?   -  person Denis Loh    schedule 11.10.2013


Ответы (2)


Вы должны установить параметры в частной части контекста кодека:

av_opt_set(eccx->priv_data, "profile", "baseline", 0);

конечно, предполагая, что eccx является экземпляром AVCodecContext. Затем откройте кодек с помощью

avcodec_open2(eccx, codec, NULL);

где codec — это ваш экземпляр AVCodec, который вы уже должны были получить примерно так:

AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);

Вы можете проверить, что это работает, указав недопустимое имя профиля, тогда библиотека сообщит вам допустимые имена профилей при стандартной ошибке.

person nalply    schedule 14.04.2015

vprofile - это опция avconv (и в любом случае недокументированная/устаревшая/не рекомендуемая для использования, вместо этого используйте -profile:v). avconv анализирует его, и имя параметра, которое на самом деле отправляется в libavcodec, просто profile. Так что это то, что вы должны использовать.

person Anton Khirnov    schedule 14.10.2013