3

我正在尝试使用 libavcodec (ffmpeg) 将原始像素数据编码为 mp4 格式。一切都很顺利,我得到了质量不错的 .avi 文件,但有时编解码器会发出“编码帧太大”的警告。当它这样做时,某些帧的一部分(通常是帧的底部)看起来会乱码或全部混淆。任何人都可以告诉我何时发出此警告。以下是我用于编码器的设置:

qmax = 6;
qmin = 2;
bit_rate = 200000; // if I increase this, I get more warnings. 
width = 1360;
height = 768;
time_base.den = 15; // frames per second
time_base.num = 1;
gop_size = 48;
pix_fmt = PIX_FMT_YUV420P;

问候,

4

3 回答 3

4

据我所知,ffmpeg 分配了一个 2MB 的恒定缓冲区大小来保存压缩帧。例如,1080p 是 3MB 未压缩,编解码器不能总是将大帧压缩到小于 2MB。

您可以通过增加缓冲区大小和/或使其动态化来解决此问题。

于 2010-12-14T18:07:10.897 回答
2

很可能该编解码器的缓冲区不够大。尝试更改 rc_buffer_size。或者,您可以尝试以下设置:

ctx->bit_rate = 500000;
ctx->bit_rate_tolerance = 0;
ctx->rc_max_rate = 0;
ctx->rc_buffer_size = 0;
ctx->gop_size = 40;
ctx->max_b_frames = 3;
ctx->b_frame_strategy = 1;
ctx->coder_type = 1;
ctx->me_cmp = 1;
ctx->me_range = 16;
ctx->qmin = 10;
ctx->qmax = 51;
ctx->scenechange_threshold = 40;
ctx->flags |= CODEC_FLAG_LOOP_FILTER;
ctx->me_method = ME_HEX;
ctx->me_subpel_quality = 5;
ctx->i_quant_factor = 0.71;
ctx->qcompress = 0.6;
ctx->max_qdiff = 4;
ctx->directpred = 1;
ctx->flags2 |= CODEC_FLAG2_FASTPSKIP;
于 2010-12-16T16:43:20.517 回答
1

在示例代码中,我发现了类似的内容:

outbuf_size = 100000;
outbuf = malloc(outbuf_size);

[...]

out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);

推动outbuf_size更大解决了这个问题。

于 2011-12-23T16:07:58.207 回答