Android 如何将AVFrame转换为glTexImage2D使用的纹理?
正如您所知,AVFrame有2个属性:pFrame->data,pFrame->linesize。在我从video/sdcard/test.mp4(android平台)读取帧并转换为RGB AVFrame vice后:Android 如何将AVFrame转换为glTexImage2D使用的纹理?,android,c,opengl-es,ffmpeg,Android,C,Opengl Es,Ffmpeg,正如您所知,AVFrame有2个属性:pFrame->data,pFrame->linesize。在我从video/sdcard/test.mp4(android平台)读取帧并转换为RGB AVFrame vice后: img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, t
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中显示视频。非常感谢您的帮助 pFrameRGB的实际像素数据位于pFrameRGB->data[0]。。。在glTexImage2D调用中,使用GL_RGBA而不是GL_RGB。不管怎么说,我就是这么做的。假设您已经正确创建了纹理和顶点坐标,那么应该可以正常工作了。如果没有帮助,我可以发布一些代码示例。两件事:(1)目标宽度和目标高度的幂是2吗?如果没有,您将得到一个空白屏幕。您需要将图片缩放到2的幂。(2) 正如Kieran指出的,在glTexImage中显示“数据”的地方,需要使用pFrameRGB->data[0] 还有一件事,你不需要使用RGBA(除非它更快,我还没有测试过)。如果执行此操作,请将ffmpeg目标格式更改为PIX_FMT_RGBA,然后将两个GL_RGB实例更改为GL_RGBA
除此之外,我认为你的代码没有任何问题。我有几乎相同的代码,它运行得很好。你能用GL_RGBA中的pFrameRGB->data[0]发布一些代码示例到纹理吗,我也这样做:sws_scale(img_convert_ctx,(const uint8_t*const*)pFrame->data,pFrame->linesize,0,pCodecCtx->height,pFrameRGB->data,pFrameRGB->linesize);数据=(char*)malloc(pFrameRGB->linesize[0]*目标高度)memcpy(数据,pFrameRGB->data,pFrameRGB->linesize[0]*目标高度)*w=320,*h=240;my函数返回glTextImage2D的数据、宽度和高度:glTextImage2D(GL_纹理_2D,0,GL_RGBA,*w,*h,0,GL_RGBA,GL_无符号_字节,数据);但我不知道;i don’我没有看到任何出现的图片,我错了吗?嗨,你能给Kieran发一些代码示例吗?我只是得到一个空白屏幕,在我的sws上下文中,我将854x480输入更改为512x256的RGB24(用于2的功率要求),然后在sws_比例中()我转换并放入pFrameRGB,然后我的GLTEXAGE2D看起来像这样:GLTEXAGE2D(GLTEXAGE2D,0,GLU RGBA,512,256,0,GLU RGBA,GLU无符号字节,pFrameRGB->data[0]);但我什么也没得到,完全是空白屏幕。有什么想法吗?