【问题标题】:how to assign the video level to struct AVCodecContext in ffmpeg?如何在ffmpeg中将视频级别分配给struct AVCodecContext?
【发布时间】:2019-06-14 01:11:18
【问题描述】:

我正在使用 ffmpeg 编写 C++ 视频编码 API。视频级别是一个重要参数,但我不知道如何将其分配给 AVCodecContext。

我看了ffmpeg文档发现“level”是int类型,下面是avcodec.h文件第3014行的定义。

           /**
 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类型。我认为 level 应该是一个枚举类型,但我找不到任何关于它的定义。

我在网上看到过一些用法,比如:

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

但我认为这些用法是错误的.. 我认为正确的分配方式是这样的:

  pCtx->level = FF_LEVEL_UNKNOWN;

所以我想知道是否有一些关于级别的相关枚举类型定义以及如何定位它。

【问题讨论】:

    标签: c++ ffmpeg


    【解决方案1】:

    假设您使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2020-03-05
      • 1970-01-01
      • 2013-06-03
      • 2012-02-28
      • 1970-01-01
      • 2020-11-13
      • 2012-06-30
      相关资源
      最近更新 更多