到本地Bundle.main的URL总是返回nil。

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

概述

我在为孩子们做一个简单的唱歌游戏。游戏只是播放一个视频,并显示三个选项。我在更新视频,所以我把它删除了从 资产.xcassets 然后添加新的。

问题是

现在我得到了这个错误。

Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Volumes/Documentos/Trabajo/Codigo proyectos/Currents/HANDSUP/diloEnSenas/SingsCategoryView.swift, line 69
2020-05-12 14:03:46.769427-0500 HandsUP[12221:549710] Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Volumes/Documentos/Trabajo/Codigo proyectos/Currents/HANDSUP/diloEnSenas/SingsCategoryView.swift, line 69

这是我遇到问题的代码

struct video: View {
    var url: String

    var body: some View{
        VideoPlayerView(playerQueve: self.changeVideo(file: self.url))
    }

    func changeVideo(file: String) -> AVQueuePlayer {

        //let fileURL = file
        //let url = Bundle.main.url(forResource: fileURL , withExtension: "mp4")

        let url = Bundle.main.url(forResource: "color_1" , withExtension: "mp4")

        let playerItem = AVPlayerItem(url: url!)

        //set video

        let player = AVQueuePlayer(playerItem: playerItem)

        return player
    }
}

之前还能正常使用。所以我首先想到的是我添加文件的方式不对,但是我又检查了一下,和视频在同一个文件夹里的按钮都能正常显示。

enter image description hereenter image description hereenter image description hereenter image description here

像你可以看到最后一张图中的按钮显示得很好,按钮图片也在同一个文件夹中。

enter image description here

enter image description here第二件事我检查的是构建阶段,但所有文件都在正确的文件夹中。

疑问

  • 为什么没有得到文件?
  • 如何调试URL?
swift url swiftui avplayeritem
1个回答
1
投票

如果你把你的视频文件添加到你的主捆绑,通过拖放和复制项目,如果需要的话,你可以直接访问他们这样。

let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")

如果你想直接从资产中访问你的视频,你可以把它作为 NSObjectNSDataAsset.

let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!

编辑。

如果你把你的视频图像添加到你的MainBundle中,你可以在显示你的应用程序的包内容时看到它们。这就是URL指向的地方。有了资产,你就不会通过股票得到一个URL。我现在做的是,我把asset的内容以数据的形式获取,把它复制到我的应用程序的Documents文件夹中,然后存储在那里。然后你也会得到一个到该目录的URL。(这应该是你的最佳解决方案,我会直接把视频复制到你的Bundle里)


1
投票

如果您想从Assets.xcassets获取数据,您应该使用 NSDataAsset 喜欢 NSDataAsset(name: "color_1")?.data. 然而,你得到的是原始数据,而不是一个URL。所以在你的实施中,关键是要把mp4文件复制在 复制捆绑资源 构建阶段,它将直接复制到您的主应用程序捆绑,按照 捆绑结构而不是将其添加到xcassets目录中。确保你复制的文件的文件名和扩展名与你的代码中使用的文件相同。


1
投票
func changeVideo(file: String) -> AVQueuePlayer? {

   //let fileURL = file
   //let url = Bundle.main.url(forResource: fileURL , withExtension: "mp4")

    If let url = Bundle.main.url(forResource: "color_1" , withExtension: "mp4”) {

            let playerItem = AVPlayerItem(url: url)

            //set video

            let player = AVQueuePlayer(playerItem: playerItem)

            return player
    }
    else {
         return nil
    }
}

封装url参数并修改为:VideoPlayerView(playerQueve: self.changeVideo(file: self.url))


1
投票

好吧,我还是很困惑发生了什么,但这里是什么工作对我来说。

开始,我使用的是外部磁盘的源代码在那里,所以我非常肯定的是不相关的,但我改变位置到我的本地磁盘。

首先,我删除了所有的文件,也在finder中删除了真正的文件在项目上的文件夹。

第二,然后我复制我的资产文件夹白Finder在项目文件夹中

enter image description here

第三,我把所有的文件夹拖到主捆绑中,但我没有检查创建组,而是检查创建文件夹引用。

enter image description here

因此,我的所有文件夹都是黄色的(当我拖动文件夹并选中创建组时,里面的文件夹就变成蓝色的了

四、我把黄色文件夹拖放到Assets.xcassets中(我把每个视频的图片按钮也放在文件夹上了

并重新运行,所以它再次工作

enter image description here

所以,现在它的工作再次感谢所有的帮助,我认为关键是有真正的文件在捆绑和目标检查。

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