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 に答える