我正在编写代码以将 MP4 文件中的帧转换为 OpenGLES 纹理,并使用 AVAssetReaderTrackOutput 类来访问像素缓冲区。输出的最佳像素缓冲区格式是什么?现在,我正在使用旧代码在 OpenGLES 着色器中将 YUV420P 转换为 RGB,因为我之前使用 libav 来提供它。现在我正在尝试使用 AVFoundation 并想知道我的 OpenGLES 着色器是否比将像素缓冲区格式设置为 RGBA 更快,或者我是否应该使用 YUV 格式并保留我的着色器。
谢谢
我正在编写代码以将 MP4 文件中的帧转换为 OpenGLES 纹理,并使用 AVAssetReaderTrackOutput 类来访问像素缓冲区。输出的最佳像素缓冲区格式是什么?现在,我正在使用旧代码在 OpenGLES 着色器中将 YUV420P 转换为 RGB,因为我之前使用 libav 来提供它。现在我正在尝试使用 AVFoundation 并想知道我的 OpenGLES 着色器是否比将像素缓冲区格式设置为 RGBA 更快,或者我是否应该使用 YUV 格式并保留我的着色器。
谢谢
我想这取决于您的数据的目的地是什么。如果您所追求的只是传递数据,那么原生 YUV 应该比 BGRA 更快。如果您需要将数据读回 RGBA 或 BGRA,我会坚持使用 BGRA 并使用 OpenGL 纹理缓存而不是 glReadPixels()。
我建议阅读有关 YUV 方法的这个 SO 问题的答案。引用:
“无论如何,视频帧都需要进入 GPU:如果您的视频具有 4:2:0 的采样色度,使用 YCbCr 可以为您节省 25% 的总线带宽。”