24

背景

QTKit (QuickTime Kit) 是 10.3 天的 Mac 框架,在 10.5 中添加了一些层,例如QTMovieLayer. QTMovieLayer 的优点之一是您可以使用content图层上的常规属性访问电影内容并取回CAImageQueue对象。这样做的好处是您可以创建一堆常规CALayers 并将图像队列设置为其内容,并通过设置正确的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 的替代品,您可以在其中获取当前播放视频的内容并同时在多个其他层中显示其部分内容?

4

1 回答 1

1

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

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

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

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

于 2014-01-07T08:04:39.617 回答