繁体   English   中英

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

[英]iOS alternative to QTMovieLayer that has non-nil `contents`?

背景

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

在此输入图像描述

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

我的问题

我想在iOS上做同样的事情,但那里不存在QTKit。 也就是说,我正在寻找存在于iOS 上的 QTMovieLayer的替代品, 其中content属性不是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 :(

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框架

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


回顾一下这个问题:

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

为了从捕获会话或玩家会话中获取视频/音频数据缓冲区,

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM