Ios FFmpeg AVFrame到OpenGL纹理,无需YUV到RGB软转换
我想在iOS上解码加密的H264视频文件。我已经移植了我们的解密算法,它工作得很好。但是,由于SDK中缺少API,我们无法直接使用H264硬件解码器 所以我试图找到另一种方法来解码H264视频。我正在尝试使用FFmpeg解码这些视频,即使可能存在一些LGPL许可证问题。我解码H264视频没有任何问题,我渲染H264帧感谢OpenGL ES纹理。但也存在一些性能问题。我检测了我的代码,瓶颈是ffmpeg重缩放和YUV到RGB的转换。 我知道我可以使用OpenGL ES 2.0着色器,通过GPU加速将YUV转换为RGB(相关文章)。 我还知道AVFrame结构是如何组成的:数据[0]表示Y数据,数据[1]表示U数据,数据[1]表示V数据。但我不明白如何使用线大小[x]和数据[x]将数据传输到OpenGL纹理 有人有AVFrame YUV到OpenGL纹理的例子吗 谢谢,Ios FFmpeg AVFrame到OpenGL纹理,无需YUV到RGB软转换,ios,opengl-es,ffmpeg,rgb,yuv,Ios,Opengl Es,Ffmpeg,Rgb,Yuv,我想在iOS上解码加密的H264视频文件。我已经移植了我们的解密算法,它工作得很好。但是,由于SDK中缺少API,我们无法直接使用H264硬件解码器 所以我试图找到另一种方法来解码H264视频。我正在尝试使用FFmpeg解码这些视频,即使可能存在一些LGPL许可证问题。我解码H264视频没有任何问题,我渲染H264帧感谢OpenGL ES纹理。但也存在一些性能问题。我检测了我的代码,瓶颈是ffmpeg重缩放和YUV到RGB的转换。 我知道我可以使用OpenGL ES 2.0着色器,通过GPU加速
David1.第一种方法是可以使用
libyuv
2.您还可以在libswscale中使用sws\u getCachedContext
和sws\u scale
两个函数。ffmpeg
的模块将AV\u PIX\u FMT\u YUV420P
转换为AV PIX\u FMT\u 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\u PIX\u FMT\u 0BGR32
数据位于data[0]
和linesize[0]