背景
QTKit (QuickTime Kit) 是 10.3 天的 Mac 框架,在 10.5 中添加了一些层,例如QTMovieLayer
. QTMovieLayer 的优点之一是您可以使用content
图层上的常规属性访问电影内容并取回CAImageQueue
对象。这样做的好处是您可以创建一堆常规CALayer
s 并将图像队列设置为其内容,并通过设置正确的contentRect
. 这意味着您可以在只运行一部电影的情况下创建如下图所示的内容,并且可以获得同步和内存效率。
我可以发布这段代码,但我怀疑它与我的问题有关,因为问题是关于 iOS 的,而 QTKit 不存在。
我的问题
我想在 iOS 上做同样的事情,但那里不存在 QTKit。也就是说,我正在寻找 QTMovieLayer 的替代品,它存在于 iOS上,其中content
属性不为零(这是重要部分),以便我可以在多个图层之间共享内容。
此外,当我设法让视频在多个图层中播放时,我希望能够指定视频的哪个部分应该在哪个图层中播放(如上图所示)
我试过的
在 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 :(
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,因为它本身不显示任何内容,而仅将状态赋予其层子树。
媒体播放器框架
媒体播放器框架没有图层变体,创建播放器视图控制器并获取播放器视图的图层对我来说似乎不是一个有效的选择。(是的,我什至懒得尝试。)
问题回顾:
iOS 上是否存在 QTMovieLayer 的替代品,您可以在其中获取当前播放视频的内容并同时在多个其他层中显示其部分内容?