【发布时间】:2016-11-08 14:17:02
【问题描述】:
我正在尝试从使用 Alamofire 下载的数据文件中播放 mp3。这首歌很好,我可以用 AVAudioPlayer(data: Data) 播放它。我应该如何使用 AVPlayer 播放相同的数据文件?我找不到如何从数据创建 PlayerItem 或从数据创建 AVAsset。 另外,我有歌曲路径的 url,但该 URL 不适用于 AVPlayer。只是没有播放音乐。
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()
}
}
【问题讨论】:
-
在
self.player.play()上设置断点。那条线真的执行了吗? -
好的,在您说
self.player.play()时,您可以尝试记录一些有关播放器状态的更多信息。它的currentTime是什么?它的currentItem是什么?如果它有一个项目,那个项目的status是什么?那个项目的asset是什么? -
它打印出正确的信息:prntscr.com/d4nnmm
-
在您记录
status的位置,请改为记录status.rawValue。这将在控制台中为我们提供一个我们可以实际读取的值。我们真的很想知道这件事是否存在status问题。
标签: ios swift avplayer avplayeritem