我有很多ARGB二进制数据,需要使用FFmpeg API将它们编码为mp4文件。最困难的事情是处理质量,速度和比特率之间的平衡。
以下是从相同ARGB数据生成的mp4文件的两个下载链接。
通过命令行生成的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始终保持相对较高的比特率。我认为重点是控制比特率。