2016-11-08 3 views
1

Я пытаюсь воспроизвести mp3 из файла данных, который я загрузил с помощью Alamofire. Песня прекрасна, я могу воспроизвести ее с помощью AVAudioPlayer (data: Data). Как мне воспроизвести один и тот же файл данных с помощью AVPlayer? Я не мог найти, как создать PlayerItem из Data или AVAsset из Data. Кроме того, у меня есть URL-адрес для пути к песне, но этот URL-адрес не работает с AVPlayer. Музыка просто не играет.AVPlayerItem из URL-адреса не играет

func startSong(withIndex: Int) { 
    if let item = getItem(atIndex: withIndex) { 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      print("AVAudioSession Category Playback OK") 
      do { 
       try AVAudioSession.sharedInstance().setActive(true) 
       print("AVAudioSession is Active") 
      } catch let error as NSError { 
       print(error.localizedDescription) 
      } 
      let playerItem = item 
      self.player = AVPlayer(playerItem: playerItem) 
     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 
    } 
} 

func getItem(atIndex: Int) -> AVPlayerItem? { 

    var item: AVPlayerItem 

    var url: URL 

    let song = playlist.getSong(index: atIndex) 

    if PlaylistsService.sharedService.isFileDownloaded(inPath: SongPath.Offline(id: (song?.getID())!).path()) { 
     url = URL(fileURLWithPath: SongPath.Offline(id: (song?.getID())!).path()) 
    } else if PlaylistsService.sharedService.isFileDownloaded(inPath: SongPath.Temp(id: (song?.getID())!).path()) { 
     url = URL(fileURLWithPath: SongPath.Temp(id: (song?.getID())!).path()) 
    } else { 
     self.downloadSong(song: song!) 
     url = URL(fileURLWithPath: SongPath.Temp(id: (song?.getID())!).path()) 
    } 

    item = AVPlayerItem(url: url) 

    return item 
} 

@IBAction func playPause(_ sender: UIButton) { 
    sender.isSelected = !sender.isSelected 
    if sender.isSelected { 
     print("Play") 
     self.player.play() 
    } else { 
     print("Pause") 
     self.player.pause() 
    } 
} 
+0

Поместите точку останова на 'self.player.play()'. Выполняется ли эта строка? – matt

+0

Да, да. http://prntscr.com/d4njv4 – sphynx

+1

Хорошо, в точке, где вы говорите 'self.player.play()', вы можете попробовать зарегистрировать дополнительную информацию о состоянии плеера. Что такое 'currentTime'? Что такое 'currentItem'? Если у него есть элемент, что такое 'статус' этого элемента? Что такое «актив» этого элемента? – matt

ответ

1

Только что выяснено, что AVPlayerItem не может создать объект из URL-адреса, указывающего на файл данных. Вы должны иметь URL-адрес с расширением файла «.mp3», например. Теперь все работает, когда я добавил расширение к пути для загрузки и воспроизведения.

+0

Да, я должен был знать это, когда увидел числовое имя этого файла. Извините, я не понял этого. – matt