質問

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;

よろしく、

役に立ちましたか?

解決

FFMPEGを収集できるものから、2MBの一定のバッファサイズを割り当てて圧縮フレームを保持します。たとえば、1080pは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