我正在为iPad开发一款iOS应用程序,需要在屏幕的某些部分播放视频。我有几个需要按照未知顺序依次播放的视频文件。视频之间切换时可以显示上一个或下一个视频的最后或第一帧,但不能出现闪烁或无内容的白屏现象。这些视频不包含音频。必须考虑内存使用情况。这些视频具有非常高的分辨率,可以同时播放多个不同的视频序列。
为了实现这一点,我已经尝试了一些解决方案,它们如下:
1. 使用AVComposition的AVPlayer播放所有视频
在这个解决方案中,我有一个AVPlayer,它只使用一个AVComposition制作的AVPlayerItem,其中包含所有并排放置的视频。当要播放特定的视频时,我会在组合中寻找下一个视频开始的时间。这种解决方案的问题是,在寻找时,播放器会快速显示一些正在寻找的帧,这是不可接受的。似乎没有办法直接跳转到组合中的特定时间。我尝试通过制作刚刚完成的视频的最后一帧的图像来解决此问题,然后在AVPlayer前面显示它,在寻找完成后将其删除。我使用AVAssetImageGenerator制作图像,但由于某种原因,图像的质量与视频不同,因此在视频上显示和隐藏图像时会有明显变化。 另一个问题是AVPlayer使用了大量内存,因为单个AVPlayerItem包含了所有视频。
2. 同时使用多个AVPlayerItem的AVPlayer
此解决方案为每个视频使用AVPlayerItem,并在切换到新视频时替换AVPlayer的项目。问题是,当切换AVPlayer项目时,它将显示一个白屏一段时间,以加载新项目。为了解决这个问题,可以使用在加载时放置最后一帧前面的图像的解决方案,但仍存在图像和视频质量不同且明显的问题。
3. 两个AVPlayer叠在一起轮流播放AVPlayerItem
我尝试过的下一个解决方案是有两个AVPlayer叠在一起,轮流播放AVPlayerItems。因此,当其中一个播放器播放完毕时,它将停留在视频的最后一帧。另一个AVPlayer将被移到前台(其项目设置为nil,因此是透明的),并且下一个AVPlayerItem将插入该AVPlayer。只要加载完成,它就会开始播放,两个视频之间平滑转换的幻象将保持完整。这种解决方案的问题是内存使用量。在某些情况下,我需要同时在屏幕上播放两个视频,这将导致同时有4个具有已加载AVPlayerItem的AVPlayer。由于视频可能具有非常高的分辨率,这简单地太多内存。
是否有人对总体问题和上述尝试的解决方案有想法、建议、评论或其他东西。