【问题标题】:How to set x264 baseline profile with libav in C++如何在 C++ 中使用 libav 设置 x264 基线配置文件
【发布时间】:2013-04-05 12:06:46
【问题描述】:

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

【问题讨论】:

  • 什么是 VIDEO_FRAME_WIDTH 和 VIDEO_FRAME_HEIGHT?是不是这些分辨率太高了?
  • 配置文件独立于关卡。级别限制帧大小。 1.3 级允许帧达到 CIF (en.wikipedia.org/wiki/H264#Levels)。输入视频流具有 CIF。输入视频可能包含 B 帧,这些在 Baseline 中是不允许的,但我如何说服 libav 将它们转换为 I 或 P 帧?

标签: c++ libavcodec x264 libav libx264


【解决方案1】:

vprofile 是一个 avconv 选项(以及一个未记录/已弃用/不推荐使用,请改用-profile:v)。 avconv 解析它,实际发送到libavcodec 的选项名称只是profile。所以这就是你应该使用的。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2021-07-02
      • 2022-11-07
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2020-08-07
      • 2013-08-18
      • 2016-05-20
      相关资源
      最近更新 更多