2012-07-20 2 views
2

Je muxage des images au format PIX_FMT_ARGB dans une vidéo mp4. Tout cela fonctionne bien, sauf que la dernière rangée de pixels de l'image sortante est foutue, dans la plupart des cas, la dernière rangée est complètement noire, parfois il y a d'autres couleurs, cela semble dépendant de la machine sur laquelle elle fonctionne .sws_scale remonte la dernière ligne de pixels en codage x264 mp4 plus petit

Je suis absolument sûr que l'erreur doit être dans sws_scale, car je sauvegarde les images avant et après la mise à l'échelle. Les images d'entrée n'ont pas l'erreur, mais après le sws_scale() je sauvegarde l'image yuv et l'erreur est apparente.

Voici un exemple:

originale

enter image description here

Yuvfile (après sws_scale)

enter image description here

Au bas de la Yuvfile, vous verra la rangée noire.

Voilà comment je fais la mise à l'échelle (il est après les exemples officiels de ffmpeg, plus ou moins):

static int sws_flags = SWS_FAST_BILINEAR | SWS_ACCURATE_RND; 

if (img_convert_ctx == NULL) 
{ 
    img_convert_ctx = sws_getContext(srcWidth, srcHeight, 
      PIX_FMT_ARGB, 
      codecContext->width, codecContext->height, 
      codecContext->pix_fmt, 
      sws_flags, NULL, NULL, NULL); 
    if (img_convert_ctx == NULL) 
    { 
     av_log(c, AV_LOG_ERROR, "%s","Cannot initialize the conversion context\n"); 
     exit(1); 
    } 
} 
fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight); 

sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize, 
     0, srcHeight, picture->data, picture->linesize); 

J'ai essayé un certain nombre de différents drapeaux de SWS_, mais tous donnent le même résultat.

Cela peut-il être un bogue dans sws_scale ou est-ce que je fais quelque chose de mal? J'utilise la dernière version des bibliothèques ffmpeg.

Répondre

2

Le problème était cette fonction:

fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight); 

Il n'a pas copié l'image d'entrée à l'tmp_picture correctement. En effet a sauté la dernière ligne.

Morale: Ne faites pas confiance fonctions années-vieux: D

+0

Oui, en effet. Suspecter tout :) – d33pika

1

180 n'est pas un multiple de 8, cela pourrait être la raison de la ligne noire. Pouvez-vous essayer de le mettre à l'échelle au multiple de 8 le plus proche, disons 184 ou 192 (multiple de 16)? Codecs non h264 besoin de plusieurs de 8 en hauteur.

+0

Nous encodez en H264 (Constrained profil de référence). Mais je vais essayer cela néanmoins. – TheSHEEEP

+0

Bon, j'ai essayé, mais même si les images entrantes et la vidéo sortante sont de 320x184, cela ne fait pas de différence. – TheSHEEEP

+0

Pouvez-vous essayer 192? Combien de lignes sont noires? seulement une rangée de pixels? – d33pika

Questions connexes