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

时间:2011-04-05 07:39:08

标签: android c opengl-es ffmpeg

如您所知AVFrame有2个属性:pFrame-> data,pFrame-> linesize。我从视频/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中显示视频。非常感谢您的所有帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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