AVPlayer 仅在重新播种数据库后播放视频

问题描述 投票:0回答:1

我正在使用一系列 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
swift video core-data avplayer
1个回答
0
投票

答案很简单,我本来可以花更少的时间来弄清楚。问题是,当我重建数据库并从 .yaml 文件播种时,我正在根据 Bundle.main 的当前值生成完整路径。

当然,这并没有持续下去,所以当我调用视频时,它使用预先生成的 url 路径,如果不在填充数据库的同一会话中,则不会找到文件。我认为在部署中,它会是相同的 Bundle.main 值,所以这样就可以了。另外,如果我有一台 iPad 来尝试一下,我想它会像以前一样工作。

因此,这是最糟糕的修复方法,其中包括一些解决开发环境中存在的条件的方法。

我消除了 CoreData 架构中的 url 字段,每当请求播放文件时,我都会用静态方法重新生成它。现在工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.