Swift 4:CUICatalog:提供的资产名称无效:'(null)'仅在使用AVPlayerViewController时

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

我正在尝试播放本地视频文件并继续获取以下日志:

[framework] CUICatalog:提供的资产名称无效:'(null)'

我的视频文件位于项目目录中,也位于主捆绑资源中。我尝试了多种语法版本来播放视频。这是我现在在测试项目中的代码:

@IBAction func buttonAction(_ sender: Any) {

    if let path = Bundle.main.path(forResource: "slipMovement", ofType: 
    "mp4") {
        let video = AVPlayer(url: URL(fileURLWithPath: path))
        let videoPlayer = AVPlayerViewController()
        videoPlayer.player = video

        present(videoPlayer, animated: true, completion:  {
            video.play()
        })
    }
}

当我使用AVplayer和PlayerLayer时,我没有收到'null'消息。它只发生在我使用AVPlayerViewController时。

我对编程很新,任何帮助都会非常感激,因为我在网上找不到合适的解决方案。

swift debugging avplayer avplayerviewcontroller
1个回答
0
投票

从AWS S3播放下载的文件时遇到了同样的问题。

我没有解释错误消息背后的含义。 但在我的情况下,这是因为该文件实际上不可播放。


1. Make sure the path is correct.

我没有使用Bundle。 我把文件放在Documents目录下,然后使用FileManager来设置路径:

let documentsUrl: URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let localFileName: String = "recording.mp4" 
let localFileUrl = documentsUrl.appendingPathComponent(localFileName)

print("Playing \(localFileUrl.absoluteString)")

这会打印出这样的东西:

file:///var/mobile/Containers/Data/Application/D8AF92BD-D736-4B86-9FF4-C60ABA6C741B/Documents/recording.mp4

2. Make sure the file is actually playable.

为此,我想检查文件存储在设备上时的实际内容。 事实证明该文件已“损坏”(例如复制/下载中断),因此它确实无法播放。

  • 将iOS设备连接到Mac。
  • 从Xcode,转到Window> Devices and Simulators
  • 从左侧的已连接列表中查找您的设备。
  • 从已安装的应用列表中查找您的应用。
  • 单击列表底部的齿轮。
  • 选择下载容器..

download container

  • 将* .xcappdata下载到本地目录
  • 在Finder中打开目录
  • 右键单击* .xcappdata,然后选择Show Package Contents
  • 它应该显示如下图所示的内容
  • 检查文件的属性并尝试播放它

appdata

3. Make sure the file format is actually supported by AVPlayer

要查看支持的AVPlayer格式,请使用print(AVURLAsset.audiovisualTypes())

参考: https://developer.apple.com/documentation/avfoundation/avurlasset/1386800-audiovisualtypes


一旦路径,文件和格式都正常,我就可以使用AVPlayerAVPlayerViewController正常播放。

let player = AVPlayer(url: localFileUrl)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
}
© www.soinside.com 2019 - 2024. All rights reserved.