2017-02-08 8 views
14

나는 즉시 버퍼링을 시도하여 신속한 언어로 remote url 오디오를 재생하려고했습니다.AVPlayer가 너무 길고 readyToPlay 지연 및 서버 음악 재생 속도가 느림

그러나 문제는 readyToPlay 사례와 오랜 시간입니다.

예를 들어 사운드 URL을 실행하는 데 약 12-15 초가 소요됩니다.

내 코드입니다 :

override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

    guard context == &playerItemContext else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
     return 
    } 

    if keyPath == #keyPath(AVPlayerItem.status) { 
     let status: AVPlayerItemStatus 
     if let statusNumber = change?[.newKey] as? NSNumber { 
      status = AVPlayerItemStatus(rawValue: statusNumber.intValue)! 
     } else { 
      status = .unknown 
     } 
     // Switch over status value 
     switch status { 
     case .readyToPlay: 
      print("readyToPlay \(status.rawValue)") 
      player.play() // here play remote sound 
     case .failed: 
      print("readyToPlay \(status.rawValue)") 
     case .unknown: 
      print("failed \(status.rawValue)") 
     } 

    } 
} 
(ExploringAVFoundation) documentation've done that

에 그 플레이어를 핸들에 따라 플레이어에 준비가

var asset: AVAsset! 
var player: AVPlayer! 
var playerItem: AVPlayerItem! 

private var playerItemContext = 0 

let requiredAssetKeys = [ "playable","hasProtectedContent"] 

let url = URL(string: "http://sound_link.mp3")! 
asset = AVAsset(url: url) 

playerItem = AVPlayerItem(asset: asset, 
           automaticallyLoadedAssetKeys: requiredAssetKeys) 
playerItem.addObserver(self, 
         forKeyPath: #keyPath(AVPlayerItem.status), 
         options: [.old, .new], 
         context: &playerItemContext) 

player = AVPlayer(playerItem: playerItem) 

내가 observeValue func를 사용하여 재생

이 반환됩니다 로그 : 위의 로그에

2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0 
readyToPlay 1 
2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0 

, readyToPlay 1을 표시 4 초을 다음 사운드

단절 속도가 좋은 플레이 10 초를 가지고 내가 Android 및 최대의 서버 사운드를 재생하려고 버퍼링 및 사운드 재생 시간은 약 3 초 (Android 응용 프로그램)이지만 IOS 버퍼링 및 사운드 재생은 완전히 약 15 초입니다!

이 URL와 avPlayerItem를 인스턴스화하고 글로벌 스레드에서 다른 자산을 가져 오기 위해 당신의 관심을 끌기 위해

+0

iOS에서 재생하기에 충분한 파일을 다운로드하는 데 너무 오래 걸리는 문제가 있습니까? 테스트중인 파일에 대한 링크를 게시하여 비교할 수 있습니까? –

+0

@DaveWeston, 어떤 링크와 상관없이 - 여러 링크를 시도해도 - 링크는 'Android'에서는 올바르게 작동하지만 IOS에서는 그렇지 않다. – Saeid

+0

내가 테스트 한 결과 소리가 거의 즉시 재생되기 때문이다. 귀하의 질문에서 코드를 가져 와서이 URL을 사용했습니다 : http://www.mfiles.co.uk/mp3-downloads/frederic-chopin-piano-sonata-2-op35-3-funeral-march.mp3 –

답변

3

시도를 주셔서 감사합니다, 나는 avPlayer 메인 UI 스레드 내가 가진 자산을 가져 오기 위해 노력하고 있기 때문에 문제가 생기는 일이라고 생각 내가 avAssets 에서 자막 옵션을 읽는 것과 같은 문제는이

이 내가 (스위프트 2) 내 문제를 해결하는 방법이다, 나는 그것이 도움이되기를 바랍니다 내 플레이어에서 영화를로드 할 5~6초 더했다 :

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible) 
      dispatch_async(dispatch_get_main_queue(), { 

       if (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil) 
       { 
        // show hide subtitle button 
       } 

      }) 

     }) 
+0

DispatchQueue.global 내에 질문 코드의 두 번째 섹션을 넣으려고했습니다 (qos : .userInitiated) .async {code}, readyToPlay는 더 빠르지 만 재생 사운드는 아직 수 초가 걸린다. – Saeid

6

봅니다이 사용하기 :

player.automaticallyWaitsToMinimizeStalling = false 
+0

https://developer.apple.com/reference/avfoundation/avplayer/1643482-automatically waitstiminimizestal에서이 기능을 사용할 수 있습니다. iOS 10.0 이하 버전 – Saeid

+0

@Saeid, 예, 그렇습니다.하지만 이전 버전에서는 작동합니다. 마치이 프로퍼티가 false 인 것처럼; iOS 10에서는 기본적으로 true입니다. 내 문제를 해결했습니다 –

+0

사용할 수 없습니다 - 조건과 헨델 IOS 버전 – Saeid

1

내가 AVPlayer를 가진 동일한 지연 재생에 문제가 않습니다. 소스 URL은 sam LAN 내의 내 iPhone 외에도 MAC입니다. 지연 시간은 6 초에서 12 초 사이입니다. https://stackoverflow.com/users/4083045/vlad-hatko @Vlad Hatko의 대답이 그것을 해결하는 데 도움이되었습니다. 많은 감사합니다. "player.automaticallyWaitsToMinimizeStalling = false"를 추가하면 매력과 같은 지연 문제가 해결됩니다!

+0

12 초가 너무 길다. 안드로이드 dely 시간은 같은 url로 2 ~ 6 초 사이이다. – Saeid