2017-05-18 8 views
1

i essayer de coder la sortie opengl dans un fichier mp4 en utilisant ffmpeg mais quand je veux simplement remplir AvFrame avec des couleurs de pixels avec cet extrait de code:comment remplir pixel AvFrame par pixel

for (y = 0; y < c->height; y++) { 
for (x = 0; x < c->width; x++) { 
    int offset = 3 * (x + y * c->width); 

    if (x > 2* c->width/3 && x <c->width) 
    { 
     frame->data[0][offset + 0] = 0; // B 
     frame->data[0][offset + 1] = 0; // G 
     frame->data[0][offset + 2] = 255; // R 
    } 
    else if(x < 2 * c->width/3 && x > c->width/3) { 
     frame->data[0][offset + 0] = 0; // B 
     frame->data[0][offset + 1] = 255; // G 
     frame->data[0][offset + 2] = 0; // R 
    } 
    else { 
     frame->data[0][offset + 0] = 255; // B 
     frame->data[0][offset + 1] = 0; // G 
     frame->data[0][offset + 2] = 0; // R 
    } 
} 

alors j'ai cette vidéo sortie:

enter image description here

et moi avons eu cette option pour ffmpeg:

codec: libx264rgb & pix_fmt: AV_PIX_FMT_BGR24

en fait j'attendre quelque chose comme cette sortie vidéo:

enter image description here

Je suis aussi nouvelle dans ffmpeg et je ne vraiment savoir étoffes avancées sur l'encodage vidéo, donc Quelqu'un sait quel est le problème?

Répondre

0

i changé:

ret = av_frame_get_buffer(frame, 32); 

à

ret = av_frame_get_buffer(frame, 1); 

et fixe.

+1

Il s'agit d'une solution de contournement au problème, qui a des implications sur les performances et peut même entraîner des résultats incorrects. La taille de ligne en octets dans le plan peut être plus grande que nécessaire pour contenir tous les pixels; manière correcte est de rendre compte de cela. Utilisez le champ 'frame-> linesize' pour calculer le décalage dans le plan:' offset = 3 * x + y * c-> lineize [0] '. –

+0

@Andrey Turkin, oui votre solution fonctionne également, merci! –