我想在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纹理的例子?
谢谢, 大卫
答案 0 :(得分:1)
1。第一种方法是可以使用libyuv
。
2。您还可以在sws_getCachedContext
的{{1}}模块中使用sws_scale
和libswscale.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_0BGR32
和data[0]