如何将AVFrame转换为glTexImage2D使用的纹理?

如你所知AVFrame有2个属性:pFrame-> data,pFrame-> linesize。 我从video/sdcard/test.mp4(android平台)读取帧后,转换为RGB AVFrame副:

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); 

我转换后得到了pFrameRGB。 我需要使用glTextImage2D在opengl中对其进行纹理处理:

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

//我不知道这里的数据是pFrameRGB->数据与否,如果没有,如何将其转换为glTextImage的适当格式,这样我就可以使用AVFrame和gltextImage2D在opengl中显示video。 非常感谢你的所有帮助。

pFrameRGB的实际像素数据位于pFrameRGB-> data [0] …在glTexImage2D调用中使用GL_RGBA而不是GL_RGB。 多数民众赞成我做了什么让它工作。 假设您正确创建了纹理和顶点坐标,那么它应该可以正常工作。 如果没有帮助,我可以发布一些代码示例。

两件事:(1)target_width和target_height的权力是2? 如果没有,你会得到一个空白屏幕。 你需要将图像缩放到2的幂。(2)在glTexImage中它表示“data”,你需要使用pFrameRGB-> data [0],正如Kieran指出的那样。

还有一件事,你不需要使用RGBA(除非它更快。我还没有测试过它)。 如果这样做,则将ffmpeg目标格式更改为PIX_FMT_RGBA,然后将GL_RGB的两个实例更改为GL_RGBA。

除此之外,我认为您的代码没有任何问题。 我有几乎相同的确切代码,它运行得很好。