FFmpeg AVFrame到OpenGL纹理,没有YUV到RGB软转换

时间:2012-02-23 13:16:49

标签: ios opengl-es ffmpeg rgb yuv

我想在iOS上解码加密的H264视频文件。我已经移植了我们的解密算法,它工作正常。但是,由于SDK中缺少API,我们无法直接使用H264硬件解码器。

所以我试图找到解码H264视频的替代方案。我试图使用FFmpeg解码这些视频,即使有一些可能的LGPL许可证问题。我没有任何问题解码H264视频,由于OpenGL ES纹理,我渲染了H264帧。但是存在一些性能问题。我检测了我的代码,瓶颈是ffmpeg重新缩放和YUV到RGB的转换。 我知道我可以使用OpenGL ES 2.0着色器通过GPU加速将YUV转换为RGB(相关帖子Alternative to ffmpeg for iOS)。 我也知道如何组成AVFrame结构:Y数据的数据[0],U数据的数据[1]和V数据的数据[1]。但我不明白如何使用数据[x]的行大小[x]将数据传输到OpenGL纹理。

有没有人有AVFrame YUV到OpenGL纹理的例子?

谢谢, 大卫

1 个答案:

答案 0 :(得分:1)

1。第一种方法是可以使用libyuv

2。您还可以在sws_getCachedContext的{​​{1}}模块中使用sws_scalelibswscale.a两个功能,例如将ffmpeg转换为AV_PIX_FMT_YUV420P

AV_PIX_FMT_0BGR32

此后,enum AVPixelFormat dst_format = AV_PIX_FMT_0BGR32; if (!is->img_convert_ctx) is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx, sourceFrame->width, sourceFrame->height, sourceFrame->format, sourceFrame->width, sourceFrame->height, dst_format, SWS_BILINEAR, NULL, NULL, NULL); uint8_t *data[AV_NUM_DATA_POINTERS]; int linesize[AV_NUM_DATA_POINTERS]; av_image_alloc(data, linesize, sourceFrame->width, sourceFrame->height, dst_format, 1); AVFrame *tempFrame = sourceFrame; sws_scale(is->img_convert_ctx, (const uint8_t**) tempFrame->data, sourceFrame->linesize, 0, sourceFrame->height, data, linesize); free(data[0]); 数据位于AV_PIX_FMT_0BGR32data[0]