我正在为iPad开发一款iOS应用程序,需要在屏幕的某些部分播放视频.我有几个视频文件需要以编译时没有给出的顺序依次播放.它看起来一定只是在播放一段视频.从一个视频切换到下一个视频时,显示两个视频的最后一帧或第一帧时会有一定的延迟,但不应出现闪烁或没有内容的白色屏幕.这些视频不包含音频.考虑内存使用是很重要的.视频分辨率非常高,可以同时相邻播放多个不同的视频序列.

为了达到这个目的,我已经try 了一些解决方案.具体如下:

1.带有AVComposition的AVPlayer,其中包含所有视频

在这个解决方案中,我有一个只在AVPlayerItem上使用的AVPlayer,它使用的是一个AVComposition,其中包含彼此相邻的所有视频.当我观看特定的视频时,我会寻找下一个视频开始的时间.这个解决方案的问题是,当寻找时,玩家会快速显示它正在寻找的一些帧,这是不可接受的.似乎没有办法直接跳到作文中的特定时间.我试图通过制作刚刚完成的视频中最后一帧的图像来解决这个问题,然后在搜索时将其显示在AVPLayer前面,最后在搜索完成后将其删除.我使用AVAssetImageGenerator制作图像,但由于某些原因,图像的质量与视频不同,因此在视频上显示和隐藏图像时会有显著的变化.

2.具有多个AVPlayerItems的AVPlayer

此解决方案 for each 视频使用AVPlayerItem,并在切换到新视频时替换AVPlayer的项.问题是,当切换AVPlayer的项目时,在加载新项目时,它会在短时间内显示一个白色屏幕.为了解决这个问题,可以使用在加载时将图像放在最后一帧的前面的解决方案,但仍然存在图像和视频质量不同且值得注意的问题.

3.两名AVPlayerItem玩家轮流玩AVPlayerItem

我try 的下一个解决方案是让两个AVPlayer相互叠加,轮流玩AVPlayerItems.因此,当一个播放器打开后,它将停留在视频的最后一帧.另一个AVPlayer将被带到前面(其项目设置为nil,因此它是透明的),下一个AVPlayerItem将被插入该AVPlayer中.一旦加载,它将开始播放,两个视频之间的平滑交易的幻觉将完好无损.这个解决方案的问题是内存使用.在某些情况下,我需要同时在屏幕上播放两个视频,这将导致4个AVPlayer同时加载一个AVPlayerItem.因为视频的分辨率很高,所以内存太大了.


是否有人对上面发布的整体问题和try 过的解决方案有一些 idea 、建议、 comments 或其他东西.

推荐答案

所以这个项目现在已经在应用store 上线了,现在是时候回到这个帖子上来,分享我的发现,并揭示我最终做了什么.

What did not work

我在大AVComposition上使用的第一个选项(包含所有视频)不够好,因为无法跳转到构图中的特定时间,而不会出现小的擦洗故障.此外,由于API无法为暂停提供帧保证,所以我在合成中的两个视频之间暂停视频时遇到了问题.

第三种方法是让两名球员轮流上场,这在实践中非常有效.特别是在iPad 4或iPhone 5上.但内存较低的设备是一个问题,因为同时存储多个视频会消耗太多内存.尤其是因为我必须处理非常高分辨率的视频.

What I ended up doing

左边是选项2.在需要时为视频创建AVPlayerItem,并将其提供给AVPlayer.这个解决方案的好处是内存消耗.通过懒散地创建AVPlayerItems,并在不再需要它们时将其丢弃,可以将内存消耗降至最低,这对于支持RAM有限的旧设备非常重要.这个解决方案的问题是,当从一个视频转到下一个视频时,在下一个视频加载到内存时,会出现一个空白屏幕.我解决这个问题的 idea 是在AVPlayer后面放一个图像,显示播放器缓冲的时间.我知道我需要的图像,我们完全像素到像素完美的视频,所以我捕捉的图像是视频的最后一帧和第一帧的精确副本.这个解决方案在实践中效果很好.

The problem with this solution

但我有一个问题,即如果视频/图像不是其原始大小或模块4的zoom 比例,UIImageView中的图像位置与AVPlayer中的视频位置不同.换句话说,我对UIImageView和AVPlayer如何处理半像素有问题.情况似乎不一样.

How I fixed it

我try 了很多东西,因为我的应用程序以交互方式使用视频,以不同大小显示.我试图改变AVPlayerLayer和CALayer的放大过滤器和缩小过滤器,以使用相同的算法,但没有真正改变任何东西.最后,我创建了一个iPad应用程序,可以自动拍摄我需要的所有大小的视频截图,然后在视频zoom 到一定大小时使用正确的图像.在我展示的特定视频中,所有尺寸的图像都是像素级的.不是一个完美的工具链,但结果是完美的.

Final reflection

这个位置问题对我来说非常明显(因此非常重要,需要解决)的主要原因是,我的应用程序正在播放的视频内容是绘制动画,其中很多内容处于固定位置,只有一部分图片在移动.如果所有内容只移动一个像素,就会出现非常明显且难看的问题.今年在WWDC上,我和一位苹果工程师讨论了这个问题,他是AVFoundation的专家.当我向他介绍这个问题时,他的建议基本上是采用选项3,但我向他解释说,这是不可能的,因为内存消耗,我已经try 过这个解决方案.有鉴于此,他说我 Select 了正确的解决方案,并要求我在zoom 视频时为UIImage/AVPlayer定位提交错误报告.

Objective-c相关问答推荐

如何限制 UITextField 中的特殊字符(点和下划线除外)?

多个 WKWebView 之间的 Cookie 共享

从 float 或 double 实例化 NSDecimalNumber 的正确方法

禁用手势识别器

XCTAssertEqual 错误:(3)不等于(3)

iPhone:推送通知后如何删除徽章?

iOS 应用 Display Recorder 如何在不使用私有 API 的情况下录制屏幕?

NSMutableDictionary 线程安全

指向方法返回类型的Expected a type错误

块引用作为Objective-C中的实例变量

在 iPhone 应用程序中使用 RestKit 的最佳方式

未知类型名称类;您指的是 'Class' 吗?

获取字符串的最后 2 个字符?

Select 时 UITableViewCell 复选标记更改

从 UITabBarController 在当前上下文中呈现模态视图控制器后出现黑屏

如何在 Cocoa 中获取 NSArray 的第一个 x 元素?

使用单独的委托/数据源时的 UITableView 问题

为什么 LLDB 不能打印 view.bounds?

NSHTTPCookieStorage 状态未在应用退出时保存.那里有任何明确的知识/文档吗?

UICollectionView:如何检测滚动何时停止