3

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

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

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

谢谢,大卫

4

1 回答 1

1

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

2.你也可以使用sws_getCachedContext和的模块中的sws_scale两个函数,像这样转换为:libswscale.affmpegAV_PIX_FMT_YUV420PAV_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]);

之后,<code>AV_PIX_FMT_0BGR32 数据在data[0]linesize[0]

于 2018-11-15T09:57:41.837 回答