Comment convertir AVFrame en texture utilisée par glTexImage2D?

comme vous le savez, AVFrame a 2 propriétés: pFrame-> data, pFrame-> linesize. Après avoir lu image de video /sdcard/test.mp4 (plate-forme Android), et convertir en vice-versa RVB:

img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, target_width, target_height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); if(img_convert_ctx == NULL) { LOGE("could not initialize conversion context\n"); return; } sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); 

Je reçois pFrameRGB après conversion. J’ai besoin de le texturer en opengl en utilisant glTextImage2D:

 // Create The Texture glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 

// Je ne connais pas les données ici, c’est pFrameRGB-> data ou non, sinon, comment le convertir au format approprié pour glTextImage afin que je puisse afficher la vidéo au format opengl, en utilisant AVFrame et gltextImage2D. Toutes les aides de vous sont très appréciées.

    Les données de pixel réelles de pFrameRGB sont dans pFrameRGB-> data [0] … Dans votre appel glTexImage2D, utilisez GL_RGBA au lieu de GL_RGB. C’est ce que j’ai fait pour que cela fonctionne quand même. En supposant que vos coordonnées de texture et de sumt soient correctement créées, cela devrait permettre de les faire fonctionner. Je peux poster des exemples de code si cela ne vous aide pas.

    Deux choses: (1) les puissances target_width et target_height sont-elles de 2? Sinon, vous aurez un écran vide. Vous devez redimensionner l’image à une puissance de 2. (2) où il est indiqué “données” dans glTexImage, vous devez utiliser pFrameRGB-> data [0], comme l’a souligné Kieran.

    Une dernière chose, vous n’avez pas besoin d’utiliser RGBA (à moins que ce soit plus rapide. Je ne l’ai pas testé). Si vous le faites, vous modifiez le format cible ffmpeg en PIX_FMT_RGBA, puis vous modifiez les deux instances de GL_RGB en GL_RGBA.

    À part cela, je ne vois rien de mal à votre code. J’ai presque le même code exact et il fonctionne très bien.