我正在使用一系列 4 个函数来管理在 AVPlayer 中按顺序播放视频播放列表。
func setupPlayer(path : String?) {
var url = currentVid!.url! //path ?? currentVid!.url!
print("setting up player")
self.player = AVPlayer(url: URL(fileURLWithPath: url))
self.playerLayer = AVPlayerLayer(player: self.player)
self.videoPlayer!.layer.addSublayer(self.playerLayer!)
self.playerLayer!.frame = view.frame
videoPlayer!.isHidden = false
self.player!.play()
NotificationCenter.default.addObserver(self, selector: #selector(videoUpdate), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: self.player!.currentItem)
}
@objc func videoUpdate(start : Bool = false) {
videoPlayer?.isHidden = false
setCurrentVid()
setupPlayer(path: currentVid?.url)
self.player?.play()
print ("update ended")
}
func updateCurrentPath() {
currentPath = currentPath == nil ? 0 : currentPath! + 1
currentPath = currentPath! % currentVideos!.count
print("currentPath updated to \(currentPath)")
}
func setCurrentVid(updating: Bool = true) -> DBVideo {
if updating {
updateCurrentPath()
}
currentVid = currentVideos![currentPath!]
panel?.highlightIndicator(currentPath!)
return currentVideos![currentPath!]
}
AVPlayer 获取从 CoreData 实体字段检索的正确字符串,该字段是一个字符串。如果我从 .yaml 文件中删除了重新播种的 CoreData DB,它会按预期执行。如果我不这样做并且我正在从数据库检索数据,则它不会播放视频。
通过调试和打印语句,我看起来好像在创建 AVPlayer 时,在两种情况下都提供了相同的字符串。
添加了一些删除playerLayer和播放器并重新创建它们的代码来尝试不同的场景,我真的不认为这是问题所在,但我被难住了。
这个问题似乎可能与上游存在数据故障这一事实有关:有一个名为课程的数据库实体,其中包含作业,而挑战又包含挑战,它们本身就是视频 NSSet 的源,这是视频的源url 字符串。但是,如果字符串被传递到 AVPlayer,那为什么这很重要呢?我显然错过了一些东西。
更新:添加一行来检查 AVPlayer currentItem
@objc func videoUpdate(start : Bool = false) {
videoPlayer!.isHidden = false
setCurrentVid()
setupPlayer(path: currentVid?.url)
print("player current item \(player?.currentItem)")
self.player!.play()
print ("update ended")
}
产生
setting up player
player current item Optional(<AVPlayerItem: 0x600000024d70, asset = <AVURLAsset: 0x60000029ea20, URL = file:///Users/dandonaldson/Library/Developer/CoreSimulator/Devices/05DB48E2-AA3B-445E-A982-B8B708006B27/data/Containers/Bundle/Application/1176693C-90F4-4AFB-9DD8-74F6819B9BA5/VideoMentor.app/move%20with%20numbers.mov>>)
update ended
答案很简单,我本来可以花更少的时间来弄清楚。问题是,当我重建数据库并从 .yaml 文件播种时,我正在根据 Bundle.main 的当前值生成完整路径。
当然,这并没有持续下去,所以当我调用视频时,它使用预先生成的 url 路径,如果不在填充数据库的同一会话中,则不会找到文件。我认为在部署中,它会是相同的 Bundle.main 值,所以这样就可以了。另外,如果我有一台 iPad 来尝试一下,我想它会像以前一样工作。
因此,这是最糟糕的修复方法,其中包括一些解决开发环境中存在的条件的方法。
我消除了 CoreData 架构中的 url 字段,每当请求播放文件时,我都会用静态方法重新生成它。现在工作正常。