如何使用FFmpeg API对具有高质量,快速编码速度和低比特率的mp4进行编码?

时间:2017-08-29 16:21:28

标签: video encoding ffmpeg mp4 h.264

我有很多ARGB二进制数据,需要使用FFmpeg API将它们编码为mp4文件。最困难的事情是处理质量,速度和比特率之间的平衡。

以下是从相同ARGB数据生成的mp4文件的两个下载链接。

  • 通过FFmpeg API生成:MP4 #1

  • 通过FFmpeg命令行生成:MP4 #2

通过命令行生成的mp4具有高清晰度和低比特率(745kbps),而另一个没有足够的高质量但高比特率(1009kbps)我不知道通过命令行生成的mp4的参数但是我的部分代码如下:

 codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
 codec_ctx->width = width;
 codec_ctx->height = height;
 codec_ctx->time_base.num = 1;
 codec_ctx->time_base.den = fps;
 stream->time_base = { 1, fps };
if (!strcmp(out_fmt, "mp4"))
    {
        codec_ctx->codec_id = AV_CODEC_ID_H264;
        codec_ctx->bit_rate = 800 * 1000;
        codec_ctx->rc_max_rate = 800 * 1000;
        //codec_ctx->rc_min_rate = 200 * 1000;
        codec_ctx->rc_buffer_size = 500 * 1000;
        /* More gop_size less file size */
        codec_ctx->gop_size = 30;
        codec_ctx->max_b_frames = 3;
        /* Set relevant parameters of H264 */
        codec_ctx->qmin = 10;   //default 2
        codec_ctx->qmax = 31;   //default 31
        codec_ctx->max_qdiff = 4;
        codec_ctx->me_range = 16;   //default 0 
        codec_ctx->max_qdiff = 4;   //default 3 
        codec_ctx->qcompress = 0.6; //default 0.5
        ret = av_dict_set(dict, "profile", "high", 0);
        // Keep a balance between speed and quality when encoding
        ret = av_dict_set(dict, "preset", "superfast", 0);
        ret = av_dict_set(dict, "threads", "0", 0);
        ret = av_dict_set(dict, "crf", "26", 0);    
        // set delay time
        ret = av_dict_set(dict, "tune", "zerolatency", 0);
        return;
    }

我知道影响视频质量的参数主要是:

  

bitrate," qp"," crf",gop_size,qmin和"预设"。

我试图增加gop_size以降低比特率,但mp4质量降低了。我还发现crf越少,质量越高,比特率越高。 qmin越少,质量越高,比特率越高。并且预设更高的编码速度,比特率更高。

事实上,我想设置"预设"超快速设置" crf"到20但输出mp4会更大。那么为什么通过命令行生成的mp4可以是高质量但低比特率?如何设置AVCodecContext的参数以生成高质量,低比特率和高速度的mp4?

补充说明: 通过命令行生成的mp4大部分时间保持低比特率,有时比特率更高,但我的mp4始终保持相对较高的比特率。我认为重点是控制比特率。

0 个答案:

没有答案