具有非零`内容'的QTMovieLayer的iOS替代品?

Dav*_*ist 24 qtkit objective-c avfoundation ios

背景

QTKit(QuickTime Kit)是10.3天的Mac框架,例如在10.5中添加了一些图层QTMovieLayer.QTMovieLayer的一个好处是你可以使用content图层上的常规属性访问电影内容并获取一个CAImageQueue对象.这样做的好处是你可以创建一堆常规CALayers并将图像队列设置为它们的内容,并通过设置正确的方式为所有图层提供它们自己的电影部分contentRect.这意味着您可以创建类似下图的图像,只运行一部电影,同时获得同步和内存效率.

在此输入图像描述

我可以发布这段代码,但我怀疑它与我的问题有关,因为问题是iOS和QTKit在那里不存在.

我的问题

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

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


我试过的

在iOS上,您可以使用AVFoundation或MediaPlayer框架来播放电影.在AVFoundation中,您AVPlayerLayer可以显示电影.(您还可以AVCaptureVideoPreviewLayer显示摄像机输入的预览和AVSynchronizedLayer同步但不显示视频).

注意: 在所有这些示例中,我成功地将视频播放到包含声音和所有内容的图层中.那不是我的问题.问题是我无法将内容与其他图层共享.

我已阅读技术说明TN2300 - 将QTKit代码转换为AV Foundation但无法找到有关在图层之间共享视频内容的任何信息.

AVPlayerLayer

如果我创建一个这样的玩家图层并尝试让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 :(
Run Code Online (Sandbox Code Playgroud)

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 :(
Run Code Online (Sandbox Code Playgroud)

AVSynchronizedLayer

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

AVSynchronizedLayer类似于CATransformLayer,因为它本身不显示任何内容,只是在其子层子树上赋予状态.

MediaPlayer框架

媒体播放器框架没有图层变体,并且创建播放器视图控制器并获取播放器视图层对我来说似乎不是一个有效的选项.(是的,我甚至都懒得试试.)


回顾一下这个问题:

在iOS上是否存在QTMovieLayer的替代方案,您可以在其中获取当前播放视频的内容并同时在多个其他图层中显示其中的部分内容?

tej*_*004 1

为了从捕获会话或播放器会话获取视频/音频数据缓冲区,

  • 创建 AVCaptureVideoDataOutput / AVCaptureAudioDataOutput 对象。
  • 确认您的 AVCaptureVideoDataOutputSampleBufferDelegate 之一。
  • 将 AVCaptureVideoDataOutput 添加到您的 Capture/Player 会话中。
  • 实施协议方法。当在 AVCaptureVideoDataOutputSampleBufferDelegate 的 captureOutput... 方法中捕获/播放媒体时,您将收到包含视频/音频帧的 CMSampleBufferRef 对象。

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

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

  • 这适用于任何媒体源(例如从文件播放或从服务器流式传输)吗?从它的名字来看,它听起来好像只是为了“处理正在捕获的视频中的未压缩帧”。 (2认同)