Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios FFmpeg AVFrame到OpenGL纹理,无需YUV到RGB软转换_Ios_Opengl Es_Ffmpeg_Rgb_Yuv - Fatal编程技术网

Ios FFmpeg AVFrame到OpenGL纹理,无需YUV到RGB软转换

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加速

我想在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纹理的例子吗

谢谢,
David

1.第一种方法是可以使用
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]