Согласно документации класса URL инициализатор init?(dataRepresentation:relativeTo:isAbsolute:)
принимает аргумент Data
, да, но эти данные должны быть ASCII-представлением строки URL , а не фактические данные, которые вы хотите воспроизвести.
Что вам нужно сделать, это сохранить ваши видеоданные в файл и использовать URL-адрес файла для инициализации AVPlayer
guard let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)?.first else { return }
url.appendPathComponent("video.mpeg") // or whatever extension the video is
VideoService.instance.videoInfoArray[0].video.write(to: url) // assuming video is of Data type
let player = AVPlayer(url: url)
// other stuff with the player
Чтобы определить причину, по которой игрок не может воспроизвести ваш файл, используйте наблюдение значения ключа игрока status
свойство игрока . Если вы заметили изменение на AVPlayer.Status.failed
, то вы можете проверить свойство error
игрока, чтобы увидеть локализованную причину и код ошибки.
var playerStatusContext = 0
player.addObserver(player, forKeyPath: "status", options: [.new, .initial], context: &playerStatusContext)
// (...)
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
// Only handle observations for the playerItemContext
guard context == &playerStatusContext else {
super.observeValue(forKeyPath: keyPath,
of: object,
change: change,
context: context)
return
}
if keyPath == #keyPath(AVPlayer.status) {
let status: AVPlayer.Status
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayer.Status(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
if status == .failed {
print(player.error)
}
}
}