如何在c++中使用libav设置x264基线配置文件

How to set x264 baseline profile with libav in C++

本文关键字:设置 libav x264 基线 配置文件 c++      更新时间:2023-10-16

我正在编写一个小工具,它将视频转换为原始的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电话有用,我会很酷。非常感谢!

您应该在编解码器上下文的私有部分设置选项:

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

当然前提是eccxAVCodecContext的实例。然后用

打开编解码器
avcodec_open2(eccx, codec, NULL);

其中codec是你的AVCodec实例,你应该已经得到了类似的东西:

AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);

您可以通过提供一个无效的配置文件名称来检查这是否有效,然后库将在标准错误中告诉您有效的配置文件名称。

vprofile是一个avconv选项(并且无论如何都是一个未记录/已弃用/不推荐使用的选项,使用-profile:v代替)。avconv解析它,实际上被发送到libavcodec的选项名称只是profile。这就是你应该使用的