对于刚开始使用此功能的人来说,你所要求的并不是微不足道的,所以你可能想把它分解成更小的部分.也就是说,我已经这样做了,可以描述一般过程.
首先,您将从AVAssetReader开始,并为音频和视频轨道设置AVAssetReaderOutputs.从那些,您迭代CMSampleBufferRefs.对于每个视频帧,您将提取CVImageBufferRef.
将视频帧上传到OpenGL纹理可以采用几种不同的方式.最高效的路径是使用YUV数据并通过iOS的纹理缓存上传Y和UV平面.然后,您将使用YUV - > RGB着色器组合这些平面并转换为RGB色彩空间以进行处理或显示.
您还可以使用电影文件中的BGRA数据并将其直接上传到纹理中,但这个过程会产生更多开销.但它更简单,并且不需要手动颜色转换着色器.
之后,您将使用passthrough顶点和片段着色器获取纹理并将其渲染为四边形,或者您可以对视频执行基于着色器的处理.
存在类似的上传到Metal的过程和路径,起点也是一样的.
现在,如果您不想手动实现所有这些,我编写了一个名为GPUImage的开源框架,它封装了这个.它有Objective-C和Swift两种.如果您不想拉动整个框架,请关注GPUImageMovie(对于前者)或MovieInput(对于后者)类.它们包含执行此操作所需的所有代码,因此您可以在那里提取实现并直接使用它们.
| 归档时间: |
|
| 查看次数: |
3210 次 |
| 最近记录: |