2010-10-05 7 views
3

J'essaie d'utiliser libavcodec (ffmpeg) pour coder les données de pixels bruts au format mp4. Tout va bien et je reçois un fichier .avi avec une qualité décente, mais parfois le codec donne un avertissement "image codée trop grande". Et quand cela arrive, une partie de certaines images (généralement la partie inférieure du cadre) a l'air brouillée ou tout est mélangée. Quelqu'un peut-il me dire quand cet avertissement est donné. Voici les paramètres que je utilise pour encoder:ffmpeg (libavcodec) avertissement: cadre codé trop grand

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; 

Cordialement,

+0

Quel codec utilisez-vous? Un grep rapide sur la source ffmpeg montre que cette erreur est générée par les codecs (fichiers source dans libavcodec) et non par les muxers (fichiers source dans libavformat). – stribika

+0

Autre chose: voulez-vous un fichier avi ou mp4? – stribika

+0

J'utilise CODEC_ID_MPEG4 (en utilisant "av_guess_format (" mp4 ", NULL, NULL);"). En général le format mp4 est stocké dans des conteneurs avi (donc le résultat final est toujours le fichier avi). – ivymike

Répondre

4

D'après ce que je peux recueillir ffmpeg Alloue une taille de mémoire tampon constante de 2MB pour maintenir un cadre comprimé. 1080p est 3MB non compressé par exemple, et le codec ne peut pas toujours compresser une grande image en moins de 2MB.

Vous pouvez éventuellement résoudre ce problème en augmentant la taille du tampon et/ou en le rendant dynamique.

+0

+1 J'ai aussi trouvé cette solution. – BlackBear

+0

Merci, j'ai eu un gros problème de corruption de films liés à cela. Pour l'instant je l'ai corrigé en utilisant une taille de film plus petite. Savez-vous quelles autres façons de réduire la taille de l'image codée à côté de la résolution? Des choses comme dire changent le niveau de compression jpeg à l'intérieur des cadres, ou tel? – kriss

+0

J'ai cherché dans le code source de libavcodec et ne trouve pas de tampon 2MB. Plus encore, le message "image codée trop grande" semble être lié à de petits tampons (plus je trouve, testé dans mpegvideo_enc.c, est d'environ 3000 octets). – kriss

2

Très probablement, le tampon du codec n'est pas assez grand. Essayez de changer rc_buffer_size. Vous pouvez essayer ces paramètres:

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

Je vais devoir explorer les paramètres, mais merci. C'est quelque chose de vraiment nouveau à explorer. – kriss

1

Dans le code exemple, j'ai trouvé quelque chose comme:

outbuf_size = 100000; 
outbuf = malloc(outbuf_size); 

[...] 

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

Pousser outbuf_size être plus résolu la question.