簡體   English   中英

使用 AVPlayer 進行流式傳輸很慢

[英]Using AVPlayer for streaming is slow

我使用 AVPlayer 從互聯網流式傳輸 mp3 文件,它的工作速度非常慢。 使用分析器我發現,它首先下載整個文件,然后開始播放。 有什么解決方法嗎?

現在,我正在使用此代碼

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()

我嘗試過的事情:

  • 將 player?.play() 移動到觀察者,附加到項目的狀態屬性
  • 使用屬性preferredForwardBufferDurationpreferredPeakBitRate

結果一直是下載整個音頻文件,然后才開始播放。

請注意,問題是 - 播放器僅在整個文件下載后才開始播放,而我希望它流式傳輸 mp3。

要立即播放,您可以嘗試設置

player.automaticallyWaitsToMinimizeStalling = false

當 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");
  }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM