我正在为 iPad 开发一个 iOS 应用程序,它需要在屏幕的某些部分播放视频。我有几个视频文件需要按照编译时未给出的顺序依次播放。它必须看起来好像只是一个视频播放。当从一个视频切换到下一个视频时,这两个视频的最后一帧或第一帧会显示一些延迟,这很好,但不应该出现没有内容的闪烁或白屏。视频不包含音频。重要的是要考虑内存使用情况。这些视频具有非常高的分辨率,并且可以同时播放多个不同的视频序列。
为了获得这一点,我已经尝试了一些解决方案。它们在下面列出:
1. 带有 AVComposition 的 AVPlayer,其中包含所有视频
在这个解决方案中,我有一个 AVPlayer,它将仅在使用 AVComposition 制作的 AVPlayerItem 上使用,该 AVComposition 包含彼此相邻的所有视频。当转到特定视频时,我会寻找下一个视频开始的合成时间。此解决方案的问题是,在寻找播放器时,它会快速显示它正在寻找的一些帧,这是不可接受的。似乎没有办法直接跳转到构图中的特定时间。我尝试通过制作刚刚完成的视频中最后一帧的图像来解决这个问题,然后在搜索时将其显示在 AVPLayer 前面,最后在搜索完成后将其删除。我正在使用 AVAssetImageGenerator 制作图像,但由于某种原因,图像的质量与视频不同,因此在视频上显示和隐藏图像时会有显着变化。另一个问题是 AVPlayer 使用大量内存,因为单个 AVPlayerItem 包含所有视频。
2.具有多个AVPlayerItems的AVPlayer
此解决方案为每个视频使用 AVPlayerItem,并在切换到新视频时替换 AVPlayer 的项目。这样做的问题是,当切换 AVPlayer 的项目时,它会在加载新项目时短时间显示白屏。要解决此问题,可以使用在加载时将图像放在最后一帧前面的解决方案,但仍然存在图像和视频质量不同且显着的问题。
3. 两个 AVPlayer 相互叠放轮流播放 AVPlayerItem
我尝试的下一个解决方案是让两个 AVPlayer 相互叠加,轮流播放 AVPlayerItems。因此,当播放器完成播放时,它将停留在视频的最后一帧。另一个 AVPlayer 将被带到前面(其 item 设置为 nil,因此它是透明的),并且下一个 AVPlayerItem 将插入到该 AVPlayer 中。一旦加载它就会开始播放,并且两个视频之间的流畅交易的错觉将完好无损。此解决方案的问题是内存使用情况。在某些情况下,我需要同时在屏幕上播放两个视频,这将导致 4 个 AVPlayer 同时加载一个 AVPlayerItem。这只是太多的内存,因为视频可以是非常高分辨率的。
是否有人对上面发布的整体问题和经过尝试的解决方案有一些想法、建议、评论或其他内容。