AVPlayer 在播放包含多个视频的 AVComposition 时占用太多内存

问题描述 投票:0回答:1

我正在创建一个 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,内存消耗仍然很高。

swift memory-management avfoundation avplayer avvideocomposition
1个回答
0
投票

我也评论了你的苹果开发论坛帖子:

您需要确保在创建作品时重复使用作品中的曲目。验证您现有的合成视频轨道在进行新的插入/编辑时是否可以重复使用 - 假设您不需要多个轨道来实现过渡效果。

此 API 是 mutableTrack(兼容轨道: AVAssetTrack) -> AVMutableCompositionTrack?

其工作原理是

对于您想要编辑到作品中的每个源视频轨道:

  • 检查您的作品中是否存在现有的兼容曲目
  • 如果有的话,就用它
  • 如果没有,请制作一个新的并使用它,

重复使用同一曲目(即标准编辑)的次数越多越好,并且消耗的内存也越少。

请注意,具有相同/兼容 CMFormatDesc 的视频应允许轨道重复使用。如果您碰巧有 42 个格式完全不兼容的视频(即分辨率、帧速率、像素格式、色彩空间)都是独特的组合,您将获得零重复使用。

如果所有视频都是 1080p 30、BGRA rec 709,那么您应该获得 100% 的重复使用。

© www.soinside.com 2019 - 2024. All rights reserved.