c/c++语言开发共享如何将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 contextn"); 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。

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

      以上就是c/c++开发分享如何将AVFrame转换为glTexImage2D使用的纹理?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559692.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐