Как воспроизвести видео типа данных с помощью AVPlayer? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь воспроизвести видео после загрузки с пульта, используя следующий код.

let player = AVPlayer(url: URL(dataRepresentation: VideoService.instance.videoInfoArray[0].video, relativeTo: nil)!)
let playerController = AVPlayerViewController()
playerController.player = player
present(playerController, animated: true) {
player.play()
}

Мой класс VideoService является одноэлементным классом, а тип видеопеременной равен Data(). Однако, когда я пытаюсь воспроизвести видео с кодом ниже, это не работает. Как я могу воспроизвести видео, используя данные представителя?

1 Ответ

0 голосов
/ 04 июля 2018

Согласно документации класса 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)
        }
    }
}
...