2017-03-06 74 views
0

我使用AVPlayer从互联网上传输流式传输MP3文件,它的工作非常慢。使用探查器我发现,它首先下载整个文件,然后开始播放。有没有解决方法?使用AVPlayer进行流式传输很慢

现在,我使用这个代码

if let player = player { 
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem) 

    let item = AVPlayerItem(url: url) 

    player.replaceCurrentItem(with: item) 
} else { 
    player = AVPlayer(url: url) 
} 
player?.play() 

事情我已经试过:

  • 移动播放器.play()观察者,连接到状态财产该项目
  • 玩弄属性preferredForwardBufferDurationpreferredPeakBitRate

所有的结果是下载一个完整的音频文件,然后才开始播放。

请注意,问题是 - 播放器开始播放整个文件下载后,而我想它流MP3。

+0

你可以查看这个链接http://stackoverflow.com/questions/22813557/playing-stream-with-bad-internet-in-avplayer –

+1

尝试使用:player.automaticallyWaitsToMinimizeStalling = false – Suen

+0

@Suen,是的!它现在在整个加载之前播放。你能否将你的评论改为答案,以便其他人更容易看到它? –

回答

3

您可以尝试设置player.automaticallyWaitsToMinimizeSta lling = false立即播放。

0

可以观察员添加到时候AVPlayer变空缓冲区:

[[self.tracksPlayer currentItem] addObserver:self 
           forKeyPath:@"playbackBufferEmpty" 
           options:NSKeyValueObservingOptionNew 
           context:nil]; 

而且观察者这样你就可以知道什么时候AVPlayer缓冲到足以跟上:

[[self.tracksPlayer currentItem] addObserver:self 
           forKeyPath:@"playbackLikelyToKeepUp" 
           options:NSKeyValueObservingOptionNew 
           context:nil]; 

然后,只需检查对于您的KVO回拨:

- (void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
        change:(NSDictionary *)change 
        context:(void *)context { 

if (object == [self.tracksPlayer currentItem] && 
    [keyPath isEqualToString:@"playbackBufferEmpty"]) { 

    if ([self.tracksPlayer currentItem].playbackBufferEmpty) { 

     NSLog(@"Buffer Empty"); 
    } 
} else if (object == [self.tracksPlayer currentItem] && 
     [keyPath isEqualToString:@"playbackLikelyToKeepUp"]) { 


    if ([self.tracksPlayer currentItem].playbackLikelyToKeepUp) { 

     NSLog(@"LikelyToKeepUp"); 
    } 
    } 
} 
+0

我不确定,我的理解,它是如何帮助我的 –

+0

Apple文档说,即使playbackBufferFull为YES,playbackLikelyToKeepUp也可能为NO。据我所知,playbackLikelyToKeepUp基于互联网连接速度,而不是缓冲区中的数据量。 –

+0

还是,我不明白,它怎么可以帮到我。即使我知道,由于某些原因它还不能播放, - 我该如何帮助它开始播放? –