我需要实时处理来自远程视频的视频帧并将处理后的帧呈现在屏幕上。
我尝试使用 AVAssetReader,但由于 AVURLAsset 正在访问远程 URL,因此调用 AVAssetReader:initWithAsset
将导致崩溃。
AVCaptureSession 看起来不错,但它适用于相机而不是视频文件(更不用说远程文件了)。
因此,我现在正在探索:在 AVPlayerLayer 中显示远程视频,然后使用 GL ES 访问显示的内容。
问题:
如何将 AVPlayerLayer(或一般的 CALayer)转换为 CAEAGLLayer 并使用
CVOpenGLESTextureCacheCreateTextureFromImage()
读取像素?或者还有其他更好的方法吗?
注意:性能是一个重要的考虑因素,否则简单的屏幕捕获技术就足够了。
最佳答案
据我所知,Apple 不提供对 h.264 解码器的直接访问,而且没有办法解决这个问题。您可以使用的一个 API 是 Assets 接口(interface),您可以在其中为其提供一个 URL,然后磁盘上的该文件将被读取为 CoreVideo 像素缓冲区。您可以尝试从您的 URL 下载,然后一次写入一个视频帧一个新资源(tmp 目录中的文件)。然后,下载完成并且新的 h264 文件完全写入后,关闭写入 session ,然后作为 Assets 读取器打开该文件。您将无法使用这种方法进行流式传输,需要首先下载整个文件。否则,您可以尝试 AVPlayerLayer 方法来查看是否支持直接流式传输。请注意,纹理缓存逻辑并不容易实现,您需要正确配置 OpenGL View ,您最好只查看已经进行渲染的现有实现,而不是尝试从头开始。
关于iphone - AVPlayerLayer 中视频帧的实时处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083043/