我正在尝试将视频文件的内容(暂时不考虑音频)显示在OpenGL中的UV贴图3D对象上。我在OpenGL方面做了很多工作,但不知道从哪里开始处理视频文件,并且大部分示例似乎是用于从摄像机获取视频帧,而这不是我想要的。
目前,我感觉如果我能将视频的单独帧作为CGImageRef获取,那就没有问题了,所以我想知道如何做到这一点?也许还有更好的方法?我应该从哪里开始,iOS上最简单的视频播放文件格式是什么? .mov?
很抱歉,我正在使用iPhone打字,所以我的回答可能有点简短。
使用视频的URL(如果您喜欢,可以是本地文件URL)创建AVURLAsset。 QuickTime可以做任何事情,因此H.264格式的MOV或M4V可能是最好的来源。
查询具有AVMediaTypeVideo类型的轨道的资产。除非您的源视频具有多个摄像机角度之类的东西,否则您应该只会得到一个,因此仅获取objectAtIndex:0即可获得所需的AVAssetTrack。
使用它来创建AVAssetReaderTrackOutput。您可能想指定kCVPixelFormatType_32BGRA。
使用资产创建AVAssetReader;将资产读取器跟踪输出附加为输出。并调用startReading。
从现在开始,您可以在跟踪输出上调用copyNextSampleBuffer以获取新的CMSampleBuffers,这使您处于与从相机输入相同的位置。因此,您可以锁定该内容以获取像素内容,并通过苹果的BGRA扩展将其推送到OpenGL。
你可能需要使用播放器层并将其内容压缩成位图上下文。请参阅AVPlayerLayer的文档。但是性能可能非常差。