请注意,针对以下问题:所有资产在设备上都是本地的-不会进行网络流传输。视频包含音轨。
我正在开发一个iOS应用程序,该程序要求以最小的延迟播放视频文件以启动有问题的视频剪辑。不幸的是,直到我们真正需要启动它之前,我们不知道接下来要播放的特定视频片段。具体来说:当播放一个视频剪辑时,我们将知道下一组(大约)10个视频剪辑是什么,但是直到确切地“立即”播放下一个剪辑时,我们才确切知道哪个剪辑。
要查看实际的启动延迟,我要做的是调用addBoundaryTimeObserverForTimes
视频播放器,其时间为一毫秒,以查看视频实际开始播放的时间,我将时间戳记与指示开始播放哪个资产的代码。
从目前为止我所看到的,我发现使用AVAsset
加载的组合,然后AVPlayerItem
在准备好之后从中创建一个,然后AVPlayerStatusReadyToPlay
在调用播放之前等待,通常需要1-3秒才能开始夹。
从那以后,我切换到了我认为大致相等的位置:呼叫[AVPlayerItem playerItemWithURL:]
并等待AVPlayerItemStatusReadyToPlay
播放。大致相同的性能。
我观察到的一件事是,第一个AVPlayer项加载比其他项慢。似乎有一个想法是,在尝试播放第一个视频之前,先用空/空资产预播AVPlayer,这可能是一种很好的常规做法。[ 第一次播放声音时,AVAudioPlayer的启动缓慢
我希望尽可能缩短视频的开始时间,并且对要尝试的事情有一些想法,但希望有可能提供帮助的人提供一些指导。
更新:下面的想法7的实现产生了大约500 ms的切换时间。这是一个改进,但是最好更快地完成。
想法1:使用N个AVPlayers(无效)
使用〜10个AVPPlayer
对象并开始并暂停所有〜10个剪辑,一旦我们知道我们真正需要的剪辑,就切换到并取消暂停正确的剪辑,然后AVPlayer
重新开始下一个循环。
我认为这行不通,因为我读过AVPlayer's
iOS中的活动限制大约为4 。这里有人在StackOverflow上问这个问题,并发现了4 AVPlayer的限制:在视频之间使用avfoundation快速切换
想法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
一个比上面的方法更容易实现的想法是,将所有内容组合到一部电影中,并使用seekToTime。问题是我们会到处乱跳。本质上是随机访问电影。我认为这实际上可以解决:avplayer-movie-playing-lag-in-ios5
您认为哪种方法最好?到目前为止,在减少延迟方面我还没有取得太大进展。