从URL创建AVPlayerItem后无法播放。

4
我正在尝试使用Alamofire从下载的数据文件中播放mp3。这首歌很好,我可以使用AVAudioPlayer(data: Data)来播放它。我应该如何使用AVPlayer播放相同的数据文件?我找不到如何从Data创建PlayerItem或从Data创建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() 上设置一个断点。那行代码是否真正执行了? - matt
是的,它确实可以。http://prntscr.com/d4njv4 - sphynx
1
好的,在你说 self.player.play() 的那个点上,你可以尝试记录一些有关播放器状态的进一步信息。它的 currentTime 是多少?它的 currentItem 是什么?如果它有一个项目,那么该项目的 status 是什么?该项目的 asset 是什么? - matt
它打印了相当正确的信息:http://prntscr.com/d4nnmm - sphynx
在记录“status”时,改为记录“status.rawValue”。这样我们可以在控制台上看到实际的值。我们真的很想知道这个东西是否存在“status”问题。 - matt
刚刚发现,问题就在于 AVPlayerItem 无法从指向数据文件的 URL 创建项目。我已经在歌曲路径中添加了 .mp3 以进行下载和播放,现在一切正常了。真是浪费了这么多时间。 - sphynx
1个回答

4

刚才发现 AVPlayerItem 无法从指向数据文件的 URL 创建对象。例如,您需要具有扩展名为“.mp3”的文件才行。当我将扩展名添加到下载和播放路径中时,一切都正常了。


是的,当我看到这个文件的数字名称时,我应该知道的。很抱歉我没有注意到。 - matt
有同样的问题;添加文件扩展名解决了它。奇怪的是,在今天之前似乎没有文件扩展名也可以工作..我对这个没有解释。 - Yasper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接