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

Я пишу небольшой инструмент, который преобразует видео в сырой файл 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. Большое спасибо!

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

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

3

Другие решения

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

1

По вопросам рекламы [email protected]