请注意,对于以下问题:所有资产都是设备上的本地资产 - 没有网络流媒体正在发生.视频包含音轨.
我正在开发一个iOS应用程序,它需要播放视频文件,延迟时间最短才能启动相关视频剪辑.不幸的是,在我们真正需要启动之前,我们不知道下一个具体的视频剪辑.具体来说:当播放一个视频片段时,我们将知道下一组(大约)10个视频片段是什么,但我们不知道究竟是哪一个,直到"立即"播放下一个片段为止.
我看到实际启动延迟的做法是调用addBoundaryTimeObserverForTimes视频播放器,时间段为1毫秒,以查看视频实际开始播放的时间,并且我将该时间戳与第一个时间戳区别开来.指示开始播放哪个资产的代码.
从我迄今为止看到的情况来看,我发现使用AVAsset加载的组合,然后AVPlayerItem在它准备就绪之后创建一个,然后AVPlayerStatusReadyToPlay在我调用play之前等待,往往需要1到3秒才能启动夹.
我已经切换到我认为大致相同的东西:打电话[AVPlayerItem playerItemWithURL:]等待AVPlayerItemStatusReadyToPlay比赛.大致相同的性能.
我观察到的一件事是第一个AVPlayer项目加载比其余项目慢.似乎有一个想法是在尝试播放第一个视频之前用短/空资产预先飞行AVPlayer可能是一个很好的通用做法.[ AVAudioPlayer第一次播放声音时启动缓慢
我希望尽可能地缩短视频开始时间,并且有一些可以尝试的东西的想法,但是希望得到任何可能提供帮助的人的指导.
更新:下面的想法7,实施时产生大约500毫秒的切换时间.这是一个改进,但它更快更好.
想法1:使用N AVPlayers(不起作用)
使用~10个AVPPlayer对象并启动和暂停所有~10个剪辑,一旦我们知道我们真正需要哪个,切换到并取消暂停正确AVPlayer,并在下一个循环中重新开始.
我认为这不起作用,因为我已经读过AVPlayer'siOS中大约有4个活动限制.这里有人在StackOverflow上询问这个问题,并发现了4个AVPlayer限制:快速切换 - 视频 - 使用 - 基础
想法2:使用AVQueuePlayer(不起作用)
我不相信将10推AVPlayerItems入一个AVQueuePlayer会预加载它们以便无缝启动. AVQueuePlayer是一个队列,我认为这只会使队列中的下一个视频准备好立即播放.我不知道我们想要播放的约10个视频中的哪一个,直到开始那个视频.IOS-avplayer视频预载
想法3:AVPlayerItems在后台加载,播放和保留(不是100%确定 - 但看起来不太好)
我正在考虑在后台加载和播放每个视频片段的第一秒是否有任何好处(抑制视频和音频输出),并保持对每个视频片段的引用AVPlayerItem,当我们知道需要播放哪个项目时真实的,交换那个,并将背景AVPlayer与活动的交换.冲洗并重复.
理论上说,最近播放AVPlayer/AVPlayerItem的可能仍会保留一些准备好的资源,这会使后续播放更快.到目前为止,我还没有看到这方面的好处,但我可能没有AVPlayerLayer正确的背景设置.我怀疑这会从我所看到的事情中真正改善.
想法4:使用不同的文件格式 - 也许加载速度更快?
我目前正在使用.m4v(视频-MPEG4)H.264格式.H.264有很多不同的编解码器选项,因此有些选项可能比其他选项更快.我发现使用更高级的设置使文件大小更小会增加搜索时间,但是没有找到任何相反的选项.
想法5:无损视频格式+ AVQueuePlayer的组合
如果有一种可以快速加载的视频格式,但也许文件大小是疯狂的,那么一个想法可能是预先准备每个视频片段的前10秒,其版本臃肿但加载速度更快,但是使用H.264编码的资产.使用AVQueuePlayer,以未压缩文件格式添加前10秒,然后使用H.264中的一个,最多可达10秒的准备/预加载时间.因此,我将获得两个世界中"最好的":快速启动时间,还可以从更紧凑的格式中获益.
想法6:使用非标准AVPlayer /自己编写/使用别人的
鉴于我的需求,也许我不能使用AVPlayer,但必须求助于AVAssetReader,并解码前几秒(可能将原始文件写入磁盘),当涉及到播放时,请使用原始格式来播放它回来快.对我来说似乎是一个巨大的项目,如果我以天真的方式去做,那就不清楚/不太可能更好地工作了.每个解码和未压缩的视频帧为2.25 MB.天真地说 - 如果我们以约30 fps的速度播放视频,我最终会得到~60 MB/s的磁盘读取要求,这可能是不可能的/推动它.显然我们必须进行一定程度的图像压缩(也许是通过PVRTC进行原生的openGL/es压缩格式)......但这有点疯狂.也许有一个我可以使用的图书馆?
想法7:将所有内容组合到一个电影资产中,并搜索到当前时间
一个可能比上面的一些更容易的想法是将所有内容组合成一个电影,并使用seekToTime.问题是我们会四处奔跑.基本上随机访问电影.我认为这可能实际上没问题: …
我必须弄清楚从一个视频过渡到下一个视频的最佳方式
基本理念:一个例子就是有一个人走路的视频......用户点击视频,并且无法过渡到正在运行的人的视频(简化示例)
我的第一个想法是创建2个电影播放器并使用2个视图元素之间的过渡.但电影播放器不支持这一点.
停止当前视频,加载新内容,然后启动它是一个解决方案,但不是很优雅.我们正在为我们的销售代表制作一个互动销售工具,我们希望这看起来尽可能专业.
当前的想法:如果有一些AVPlayer的示例代码,似乎我可以使用AVVideoComposition在视频之间切换?但目前似乎没有关于如何发生这种情况的详细信息.
可能的CLUE:我认为这很简单,因为我买了一款名为Live Cams HD的应用程序,可以同时显示16种不同的视频.
有任何想法吗?提前致谢!