gpt4 book ai didi

ios - 如何在包含框架的两个视频和一个 imageView 中创建一个新视频?

转载 作者:行者123 更新时间:2023-11-28 13:43:13 30 4
gpt4 key购买 nike

我有一个父 View ,其中包含两个带有 AVPlayerLayers 的 View 和一个 UIImageView。我想将所有这些组合成一个新视频,以捕获父 View 的所有内容。

我查看了 ReplayKit,但它没有捕获 AVPlayer 的内容;它不允许我访问视频;它捕获整个屏幕而不是特定的 View 或框架。

我的一般方法是逐帧遍历视频,捕获帧的图像,将它们设置在我覆盖在 playerLayer 上的 imageView 中,然后使用 UIGraphicsGetImageFromCurrentImageContext 捕获父 View 的图像 -- 然后用所有这些图像制作视频。

我已经尝试了一些 AVFoundation 选项,但总体而言它们的性能并不是那么好。以下是我尝试过的一些选项,总是尝试上述模式。

  1. 只需使用 videoPlayer.seek(to: frame) 即可设置视频帧 -- 但此方法非常慢:每 15 秒视频大约需要 42 秒来遍历每个这样构图。

  2. 使用 AVAssetImageGenerator.generateCGImagesAsynchronously 异步获取所有视频帧,然后迭代上述模式中的那些。这是非常占用内存的,因为我有两个视频的每一帧的图像。我可以将工作分块以避免内存崩溃,但总的来说,这种方法仍然相当慢,而且这种批处理的复杂性并没有比第一种方法好多少。

  3. 使用 AVAssetImageGenerator.copyCGImage(at: frame, actualTime: nil) 同时获取每一帧,但这并不比第一个选项快。

  4. 使用 AVAssetReader 并使用 copyNextSampleBuffer 遍历每一帧——与上述任何选项相比都没有真正的改进。

我可能会做一些事情来优化处理,但我认为它们无法解决上述基本问题。例如,我可能会降低视频质量,或者由于某些视频在其帧内不可见而对其进行修剪,或者降低帧速率,但我宁愿尽可能避免这些。

在这一点上,我想我可能不得不使用 Metal。有什么建议吗?

最佳答案

这会很困难,因为您要做的是添加一个 Hook ,通过从 View 中实时捕获原始图像缓冲区流来获取已渲染的 GPU 的合成结果。这在 CPU/GPU 或内存使用方面几乎没有效率。如果您以某种方式访问​​ GPU 的 native API 以更直接的方式获取合成的原始缓冲区,您可能会成功,但这很尴尬。

更自然的做法是 - 一旦获得所需的 Material (视频、图像等)就进行适当的视频合成,然后将处理后的结果显示给用户并在您操作时对其进行操作喜欢(将数据转储为文件等)。

简而言之,尝试谷歌“ios video composition”。 AFAIK,AVFoundation 提供相关功能。您可能还想查看一些库,例如 this减少自己编写所有低级代码的麻烦。

关于ios - 如何在包含框架的两个视频和一个 imageView 中创建一个新视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55765886/

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