gpt4 book ai didi

具有非零 `contents` 的 QTMovieLayer 的 iOS 替代品?

转载 作者:IT王子 更新时间:2023-10-29 07:58:09 27 4
gpt4 key购买 nike

背景

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

enter image description here

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

我的问题

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

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


我尝试过的

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

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

我已阅读 Technical Note TN2300 - Transitioning QTKit code to AV Foundation但找不到任何关于在层之间共享视频内容的信息。

AV播放层

如果我像这样创建一个播放器层并尝试获取内容,我只会返回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

根据它的名称,您可能认为同步层将是我正在寻找的,但它不用于显示任何内容(表单标题文档):

An AVSynchronizedLayer is similar to a CATransformLayer in that it doesn't display anything itself but only confers state upon its layer subtree.

媒体播放器框架

媒体播放器框架没有图层变体,创建播放器 View Controller 和获取播放器 View 图层对我来说似乎不是一个有效的选择。 (是的,我什至懒得去尝试。)


问题回顾:

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

最佳答案

用于从捕获 session 或播放器 session 中获取视频/音频数据缓冲区,

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

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

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

关于具有非零 `contents` 的 QTMovieLayer 的 iOS 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19065816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com