QTMovieLayer具有非零“内容”的iOS替代品?

背景

QTKit(QuickTime Kit)是10.3版本的Mac框架,它在10.5中增加了一些图层,例如QTMovieLayer 。 QTMovieLayer的好处之一是可以使用图层上的常规content属性访问电影内容,并获取CAImageQueue对象。 与此相关的CALayer是,您可以创build一堆常规CALayer ,并将图像队列设置为其内容,并通过设置正确的contentRect将所有图层设置为电影的一部分。 这意味着您可以创build类似下面的图像,只有一个电影正在运行,同时获得同步和内存效率。

在这里输入图像说明

我可以发布这个代码,但我怀疑这是相关的我的问题,因为问题是关于iOS和QTKit不存在那里。

我的问题

我想在iOS上做同样的事情,但QTKit不存在。 也就是说,我正在寻找iOS 存在的QTMovieLayer的替代scheme, 其中content属性不是零 (这是重要的部分),以便我可以在多个图层之间共享内容。

另外,当我设法让video在多个层次上播放时,我希望能够指定video的哪一部分应该在哪一层中播放(如上图所示)


我试过了

在iOS上,您可以使用AVFoundation或MediaPlayer框架来播放电影。 在AVFoundation你有AVPlayerLayer可以显示电影。 (您也有AVCaptureVideoPreviewLayer用于显示相机input的预览, AVSynchronizedLayer用于同步但不显示video)。

注意: 在所有这些例子中,我成功地让video在声音和所有东西的层中播放。 那不是我的问题。 问题是我无法获取内容与其他图层共享。

我已阅读技术说明TN2300 – 将QTKit代码转换为AV Foundation,但无法find有关在图层之间共享video内容的任何内容。

AVPlayerLayer

如果我创build一个这样的播放器图层,并尝试获取contents我只能回nil

 NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video" withExtension:@"m4v"]; AVPlayer *player = [AVPlayer playerWithURL:videoURL]; [player play]; AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:player]; id videoContent = videoLayer.contents // <-- this is nil :( 

AVCaptureVideoPreviewLayer

即使我真的有兴趣回放一个电影文件我尝试使用捕捉预览图层,但内容是零

 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; AVCaptureSession *captureSession = [AVCaptureSession new]; [captureSession addInput:input]; AVCaptureVideoPreviewLayer *Layer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; [captureSession startRunning]; id videoContent = videoLayer.contents // <-- this is still nil :( 

AVSynchronizedLayer

从它的名字你可能会认为同步层将是我正在寻找,但它不是用来显示任何东西(表头文件):

AVSynchronizedLayer类似于CATransformLayer,因为它本身不显示任何东西,只是在其子层上赋予状态。

MediaPlayer框架

媒体播放器框架没有图层变体,创build播放器视图控制器,获取播放器视图层看起来对我来说不是一个有效的select。 (是的,我甚至懒得去试试。)


问题的回顾:

QTMovieLayer是否存在于iOS上,您可以在其中获取当前正在播放的video的内容,并同时在多个其他图层中显示其部分内容?

为了从捕捉会话或玩家会话获得video/audio数据缓冲区,

  • 创buildAVCaptureVideoDataOutput / AVCaptureAudioDataOutput对象。
  • 确认你的一个AVCaptureVideoDataOutputSampleBufferDelegate。
  • 将AVCaptureVideoDataOutput添加到您的Capture / Player会话。
  • 实施协议方法。 在AVCaptureVideoDataOutputSampleBufferDelegate的captureOutput …方法中捕获/播放媒体时,您将收到包含video/audio帧的CMSampleBufferRef对象。

CMSampleBufferRef对象包含媒体框架数据,时间戳记信息和媒体的格式描述。 然后可以通过将其转换为CGImageRef并将其显示在任何视图上来显示此帧。

您还可以在AVCaptureVideoDataOutput.videoSettings属性中指定所需的帧压缩格式(或未压缩的帧格式)。