我使用以下编码器配置对帧进行编码:
codecContext = avcodec_alloc_context3(encoderH264);
codecContext->width = width;
codecContext->height = height;
codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
codecContext->time_base.num = 1;
codecContext->time_base.den = 1;
codecContext->has_b_frames = false;
av_opt_set(codecContext->priv_data, "preset", "medium", 0);
av_opt_set(codecContext->priv_data, "tune", "zerolatency", 0);
av_opt_set(codecContext->priv_data, "crf", "30", 0);
它会创建一个合适的编码器。尽管令我困扰的是连续帧的大小并不总是在减小。我希望有一个FFmpeg编码器,它在第一帧中产生的图像是0.5 mb,然后是0.05 mb,然后是0.01 mb。我的NVIDIA硬件编码器就是这样做的。但是上面的FFmpeg配置在一开始就给了我这样的框架:
1556
200
225
238
238
238
238
828745
216
352
714
1129
大小稍后会有所变化,直到所有大小都定为242个字节。 有没有一种方法可以使编码器像这样:
100000
20000
1000
50
50
50
...
?
答案 0 :(得分:0)
帧大小在很大程度上取决于帧类型和帧复杂度。例如,I帧几乎总是比随后的B / P帧大,因为I帧对完整图片进行编码,而其他帧仅对该图片中的变化进行编码。大多数编解码器会定期插入I帧,因此您可以在文件中进行搜索,而无需下载和/或解码整个内容。其次,有一个信息密度的概念(有关信息论),它指出数据和信息不相同。例如,数据“ aaaaaaaaaa”包含“ ax10”。我可以写得更紧凑。但是“ hebphwhcqo”很难表示得更短。因此,信息很少(全黑)的帧会比信息很多的帧(如烟花图片)小。
回答您的问题:您要的不是东西。如果您要编码的是非运动图像,则如果您禁用场景变化检测和周期性I帧,则可以通过这种方式解决。