2010-10-05 122 views
3

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

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; 

问候,

+0

你使用什么编解码器?对ffmpeg源代码的一个快速的grep表明这个错误是由编解码器(libavcodec中的源文件)而不是muxers(libavformat中的源文件)生成的。 – stribika 2010-10-05 13:25:35

+0

另一件事:你想要一个AVI或MP4文件? – stribika 2010-10-05 13:26:02

+0

我正在使用CODEC_ID_MPEG4(使用“av_guess_format(”mp4“,NULL,NULL);”)。一般来说,mp4格式存储在avi容器中(所以最终结果总是avi文件)。 – ivymike 2010-10-05 13:36:35

回答

4

从我可以收集的ffmpeg分配2MB的恒定缓冲区大小举行压缩 框架。例如,1080p是3MB未压缩的,并且编解码器不能总是将大帧压缩到小于2MB。

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

+0

+1我也找到了这个解决方案。 – BlackBear 2010-12-14 18:33:18

+0

谢谢,我有一个与此相关的电影腐败的大问题。现在我使用更小的电影尺寸对其进行了纠正。你是否知道除了分辨率之外还有其他可能的减少编码帧大小的方法。像说改变jpeg压缩级别内的帧,或者这样的事情? – kriss 2010-12-15 13:57:43

+0

我已经在libavcodec的源代码中搜索并找不到任何2MB缓冲区。更重要的是,“编码帧太大”消息似乎与小缓冲区有关(我发现在mpegvideo_enc.c中测试的较大,大约为3000字节)。 – kriss 2010-12-16 10:34:53

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; 
+0

我将不得不探索设置,但谢谢。这是一个非常新的探索。 – kriss 2010-12-18 08:19:17

1

在示例代码中,我发现这样的:

outbuf_size = 100000; 
outbuf = malloc(outbuf_size); 

[...] 

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

outbuf_size要大解决了这个问题。