gpt4 book ai didi

ios - 没有 YUV 到 RGB 软转换的 FFmpeg AVFrame 到 OpenGL 纹理

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:01 27 4
gpt4 key购买 nike

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

所以我正在尝试寻找一种替代方法来解码 H264 视频。我正在尝试使用 FFmpeg 解码这些视频,即使存在一些可能的 LGPL 许可问题。由于 OpenGL ES 纹理,我解码 H264 视频没有任何问题,我渲染 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]。但是我不明白如何使用线大小 [x] 和数据 [x] 将数据传输到 OpenGL 纹理。

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

谢谢,大卫

最佳答案

1.第一种方法是使用libyuv

2.你也可以在ffmpeglibswscale.a模块中使用sws_getCachedContextsws_scale两个函数,像这样将 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]linesize[0]

关于ios - 没有 YUV 到 RGB 软转换的 FFmpeg AVFrame 到 OpenGL 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com