我正在创建一个 AVComposition 并将其与 AVPlayer 一起使用。当我不设置playerItem.videoComposition时,播放器工作正常并且不会消耗太多内存。这是在不使用过多内存的情况下工作的代码:
`func configurePlayer(composition: AVMutableComposition, videoComposition: AVVideoComposition) {
// Stop the player and reset if needed
player.pause()
player.replaceCurrentItem(with: nil)
// Create a new player item
let playerItem = AVPlayerItem(asset: composition)
player.play()
}`
但是,当我添加playerItem.videoComposition = videoComposition时,如下面的代码所示,内存使用量变得过多:
`func configurePlayer(composition: AVMutableComposition, videoComposition: AVVideoComposition) {
// Stop the player and reset if needed
player.pause()
player.replaceCurrentItem(with: nil)
// Create a new player item
let playerItem = AVPlayerItem(asset: composition)
playerItem.videoComposition = videoComposition
player.play()
}`
问题详情:
内存使用量似乎取决于合成中视频轨道的数量,而不是它们的持续时间。例如,两个各 30 分钟的视频所消耗的内存比 40 个各仅 2 秒的视频要少。
过多的内存使用量显示在 Xcode 调试面板的“其他进程”部分中。
仅供参考,42 个视频,每个视频不到 30 秒,使用约 1.4 GB 内存。
我很难理解为什么添加 videoComposition 会导致如此高的内存消耗,特别是因为即使没有应用层指令也会发生这种情况。任何有关如何解决此问题的见解将不胜感激。 之前 之后
我最初以为问题可能是由于视频合成中的图层指令过多造成的,但事实似乎并非如此。即使我设置了没有任何层指令的 videoComposition,内存消耗仍然很高。
我也评论了你的苹果开发论坛帖子:
您需要确保在创建作品时重复使用作品中的曲目。验证您现有的合成视频轨道在进行新的插入/编辑时是否可以重复使用 - 假设您不需要多个轨道来实现过渡效果。
此 API 是 mutableTrack(兼容轨道: AVAssetTrack) -> AVMutableCompositionTrack?
其工作原理是
对于您想要编辑到作品中的每个源视频轨道:
重复使用同一曲目(即标准编辑)的次数越多越好,并且消耗的内存也越少。
请注意,具有相同/兼容 CMFormatDesc 的视频应允许轨道重复使用。如果您碰巧有 42 个格式完全不兼容的视频(即分辨率、帧速率、像素格式、色彩空间)都是独特的组合,您将获得零重复使用。
如果所有视频都是 1080p 30、BGRA rec 709,那么您应该获得 100% 的重复使用。