2017-02-08 2 views
14

Я попытался буфер и сразу же сыграл remote url аудио с быстрым языком.AVPlayer слишком длинный и с задержкой до readyToPlay и проигрывать музыку на сервере в swift

но проблема с длинным временем до readyToPlay случай и игра.

например, звуковой url занимает около 12-15 секунд для запуска.

это мой код:

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) 

, что в соответствии с этим (ExploringAVFoundation) documentation've done that

и обрабатывать, что игрок готов к игроку играть я использовать observeValue func:

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

    } 
} 

и это возвращается журнал:

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 

в выше журнале, возьмите 4 секунды, чтобы появиться readyToPlay 1 затем принять 10 секунд, чтобы играть звук

скорость Север хорошо и я пытался играть звук сервера в Android и макс время для буферизации и воспроизведения звука составляет около 3 секунд (в приложении Android), но в IOS буферизация и воспроизведение звука полностью, полностью занимает около 15 секунд!

Благодарит Вас за внимание

+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

попытаться создать экземпляр avPlayerItem с URL, а затем принести другие активы в глобальной теме, я думаю, что проблемы происходят потому, что avPlayer пытается принести средства в основном потоке пользовательского интерфейса я имел та же проблема, когда я пытался читать варианты субтитров из avAssets потребовалось 5-6 секунд больше, чтобы загрузить фильм в плеер

это, как я решить мою проблему (в Swift 2), я надеюсь, что это помогает:

  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-automaticallywaitstominimizestal, эта функция доступна iOS 10.0 не более низкая версия – Saeid

+0

@Saeid, да, но, как я понимаю, для предыдущих версий она работает как будто это свойство было ложным; в iOS 10 это верно по умолчанию. это разрешило мою проблему –

+0

Нельзя использовать - потому что для этого требуются условия и версия Icel Handel – Saeid

1

У меня есть один и тот же замедленное проблему игры с AVPlayer. Исходным URL-адресом является мой MAC, кроме моего iPhone в локальной сети. Время задержки составляет от 6 секунд до 12 секунд. https://stackoverflow.com/users/4083045/vlad-hatko @ Ответ Валда Хатко помог разрешить его. Большое спасибо. Просто добавление «player.automaticallyWaitsToMinimizeStalling = false» решает проблему задержки как шарм!

+0

12 секунд слишком длинный, в режиме Android время от 2 до 6 секунд с тем же адресом. – Saeid

Смежные вопросы