AVPlayer 加载缓慢
Posted
技术标签:
【中文标题】AVPlayer 加载缓慢【英文标题】:AVPlayer slow loading 【发布时间】:2017-02-05 14:56:31 【问题描述】:我正在使用AVPlayer
从远程 url 播放 mp3 文件。
我在 mp3 的初始加载时间方面遇到了一些问题,它非常慢(大约 5-8 秒)。
我将它与其他第三方播放器进行了比较,它的速度要慢得多,我还将它与一个安卓播放器进行比较,它也慢得多。
所以问题不在于 url 本身,也不在于网络连接..
另外一个有趣的点是AVPlayer
开始播放mp3后,搜索速度非常快(几乎立即),是不是意味着播放器在开始播放之前下载了整个mp3文件,这就是它如此慢的原因?
我可以控制这种行为吗?如果不是,还有其他想法可能是什么原因?
【问题讨论】:
可能相关:***.com/questions/11171374/… 【参考方案1】:AVPlayer
有一些新功能(适用于 ios 10+),您可以尝试一下。我自己用过,一切正常。
/*!
@method playImmediatelyAtRate:
@abstract Immediately plays the available media data at the specified rate.
@discussion
When the player's currentItem has a value of NO for playbackBufferEmpty, this method causes the value of rate to change to the specified rate, the value of timeControlStatus to change to AVPlayerTimeControlStatusPlaying, and the receiver to play the available media immediately, whether or not prior buffering of media data is sufficient to ensure smooth playback.
If insufficient media data is buffered for playback to start (e.g. if the current item has a value of YES for playbackBufferEmpty), the receiver will act as if the buffer became empty during playback, except that no AVPlayerItemPlaybackStalledNotification will be posted.
*/
- (void)playImmediatelyAtRate:(float)rate NS_AVAILABLE(10_12, 10_0);
另外你可以查看这个变量(你也可以使用 KVO):
/*!
@property reasonForWaitingToPlay
@abstract Indicates the reason for waiting when the value of timeControlStatus is AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate
@discussion
When the value of timeControlStatus is AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate, this property describes why the player is currently waiting. It is nil otherwise.
You can use the value of reasonForWaitingToPlay to show UI indicating the player's waiting state conditionally.
This property is key value observable.
Possible values are AVPlayerWaitingWithNoItemToPlayReason, AVPlayerWaitingWhileEvaluatingBufferingRateReason, and AVPlayerWaitingToMinimizeStallsReason.
*/
@property (nonatomic, readonly, nullable) NSString *reasonForWaitingToPlay NS_AVAILABLE(10_12, 10_0);
【讨论】:
【参考方案2】:对于 iOS 10.x 或更高版本,为了减少慢速加载时间,我设置了:
avplayer.automaticallyWaitsToMinimizeStalling = false;
这似乎为我解决了问题。这可能会产生其他后果,但我还没有达到这些后果。
我的想法来自: AVPlayer stops playing video after buffering
【讨论】:
【参考方案3】:在这里,我的想法。
那个不同的文件有不同的移动原子,所以如果在这样的文件中,如果移动原子首先出现,那么这个文件会缓冲。所以这个文件下载了部分并且它正在播放继续缓冲。
在其他情况下,在文件中移动原子最后是首先下载整个文件然后播放。所以我认为这就是你的情况,这就是为什么 mp3 会延迟一些时间来下载整个 mp3。
您可以通过编码将移动原子更改为此类文件。看看这个答案Move and fix moov atom of video recorded on phone iOS
【讨论】:
AFAIK,MP3 文件没有 MOOV 原子,因为它们是特定于 MPEG4 视频流的。以上是关于AVPlayer 加载缓慢的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Swift 的 AVPlayer 一次播放会加载 playerItem 两次?