如何使用Metal或OpenGL ES渲染视频?

我说的是解码,并由我自己显示

我对MetalOpenGL ES非常陌生,不知道从哪里开始。

最佳答案

对于刚开始使用此工具的人来说,您要问的并不是一件容易的事,因此您可能希望将其分解为较小的部分。就是说,我已经做到了,可以描述整个过程。

首先,您将从AVAssetReader开始并为音频和视频轨道设置AVAssetReaderOutputs。从中,您遍历CMSampleBufferRefs。对于每个视频帧,您将提取一个CVImageBufferRef。

将视频帧上传到OpenGL纹理可以采用两种不同的方式。最有效的途径是使用YUV数据并通过iOS的纹理缓存上载Y和UV平面。然后,您将使用YUV-> RGB着色器组合这些平面,并转换为RGB色彩空间以进行处理或显示。

您也可以使用电影文件中的BGRA数据并将其直接上传到纹理中,但是该过程的开销更大。但是,它更简单,并且不需要手动颜色转换着色器。

之后,您将获取纹理并使用直通顶点和片段着色器将其渲染为四边形,或者可以对视频进行基于着色器的处理。

存在类似的上传到Metal的过程和途径,并且起点是相同的。

现在,如果您不想手动实现所有功能,那么我已经编写了一个称为GPUImage的开源框架,该框架对此进行了封装。它有Objective-CSwift变种。如果您不想拉整个框架,请专注于GPUImageMovie(对于前者)或MovieInput(对于后一种)类。它们包含执行此操作所需的所有代码,因此您可以在那里提取实现并直接使用它们。

10-08 08:04