iphone - AVPlayerLayer 中视频帧的实时处理

标签 iphone ios opengl-es-2.0 avfoundation video-processing

我需要实时处理来自远程视频的视频帧并将处理后的帧呈现在屏幕上。

我尝试使用 AVAssetReader,但由于 AVURLAsset 正在访问远程 URL,因此调用 AVAssetReader:initWithAsset 将导致崩溃。

AVCaptureSession 看起来不错,但它适用于相机而不是视频文件(更不用说远程文件了)。

因此,我现在正在探索:在 AVPlayerLayer 中显示远程视频,然后使用 GL ES 访问显示的内容。

问题:

  1. 如何将 AVPlayerLayer(或一般的 CALayer)转换为 CAEAGLLayer 并使用 CVOpenGLESTextureCacheCreateTextureFromImage() 读取像素?

  2. 或者还有其他更好的方法吗?

注意:性能是一个重要的考虑因素,否则简单的屏幕捕获技术就足够了。

最佳答案

据我所知,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/

相关文章:

iphone - Objective-C 的首选数据库管理系统(iPhone 应用程序)

iphone - Three20 构建错误

java - 绕 z 轴旋转的漂移

iphone - 没有完成按钮的 UIKeyboardTypeNumberPad

android - 如何将绘图调用和采样器值的更改与单个着色器程序正确混合?

android - 动态添加 Opengl 形状

iphone - 如何在iPhone中使用uislider设置音量控制?

iphone - 如何检测何时需要保存 NSPersistentStore?

ios - 多个 Storyboard - 多个导航 Controller

c# - ListView HasUnEvenRows 不工作