Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将AVFrame转换为glTexImage2D使用的纹理?_Android_C_Opengl Es_Ffmpeg - Fatal编程技术网

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

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

正如您所知,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, 
                   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]);但我什么也没得到,完全是空白屏幕。有什么想法吗?