سؤال

أحاول استخدام 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 يخصص حجمًا مؤقتًا ثابتًا يبلغ 2 ميغابايت لعقد إطار مضغوط. 1080p غير مضغوط 3 ميجابايت على سبيل المثال ، ولا يمكن لبرنامج الترميز دائمًا ضغط إطار كبير في أقل من 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;

في رمز المثال ، وجدت شيئًا مثل:

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