如您所知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中显示视频。非常感谢您的所有帮助。
答案 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。
除此之外,我认为您的代码没有任何问题。我有几乎相同的确切代码,它运行得很好。