我试图使用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;

此致

有帮助吗?

解决方案

从我可以收集2MB的ffmpeg的分配常数缓冲器大小以保持压缩 帧。 1080为3MB解压缩,例如,和编解码器不能总是压缩较大的帧分成小于2MB。

可以可能通过增加缓冲区大小解决这个问题,和/或使其动态。

其他提示

很可能是编解码器的缓冲区不够大。尝试改变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;

在示例代码我发现类似:

outbuf_size = 100000;
outbuf = malloc(outbuf_size);

[...]

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

outbuf_size要更大解决了问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top