Почему я могу воспроизводить видео из пакета приложений, но не видео, загруженные в файловую систему? - PullRequest
1 голос
/ 22 января 2020

Моя цель - прочитать загруженный видеофайл и сохранить его в файловой системе устройства iOS. К сожалению, видеопроигрыватель зависает со следующим кодом:

    @IBAction func playVideo(_ sender: UIButton) {
        if let video = detailItem {
            do {
                let url = try FileManager.default.url(for: .documentDirectory,
                                                      in: .userDomainMask,                                                                       
                                                      appropriateFor: nil,
                                                      create: false)
                  .appendingPathComponent(video.uuid)
                debugPrint("url: \(url)")

                // Create an AVPlayer, passing it the HTTP Live Streaming URL.
                let player = AVPlayer(url: url)

                // Create a new AVPlayerViewController and pass it a reference to the player.
                let controller = AVPlayerViewController()
                controller.player = player

                // Modally present the player and call the player's play() method when complete.
                present(controller, animated: true) {
                    player.play()
                }
            } catch {
                print("Error: \(error)")
            }
        }
    }

Я предположил, что это проблема с форматом видео, и код c моего видео не поддерживается.

Но, Когда я объединяю одно и то же видео в приложении и переключаюсь на этот код, все работает нормально:

    @IBAction func playVideo(_ sender: UIButton) {
        let url = Bundle.main.url(forResource: "myvideo", withExtension: "mp4")!

//        if let video = detailItem {
            do {
//                let url = try FileManager.default.url(for: .documentDirectory,
//                                                                        in: .userDomainMask,
//                                                                        appropriateFor: nil,
//                    create: false).appendingPathComponent(video.uuid)
                debugPrint("url: \(url)")

                // Create an AVPlayer, passing it the HTTP Live Streaming URL.
                let player = AVPlayer(url: url)

                // Create a new AVPlayerViewController and pass it a reference to the player.
                let controller = AVPlayerViewController()
                controller.player = player

                // Modally present the player and call the player's play() method when complete.
                present(controller, animated: true) {
                    player.play()
                }
            } catch {
                print("Error: \(error)")
            }
//        }
    }

Я понятия не имею, что мне здесь не хватает, и я могу получить некоторую помощь. 100

РЕДАКТИРОВАТЬ: Код для загрузки здесь:

        let downloadTask = URLSession.shared.downloadTask(with: video.downloadURL, completionHandler: { (tempPathURL, urlResponse, error) in
            guard let tempPathURL = tempPathURL else {
                return
            }

            do {
                let documentsDirectoryURL = try FileManager.default.url(for: .documentDirectory,
                                                                        in: .userDomainMask,
                                                                        appropriateFor: nil,
                                                                        create: false)
                try FileManager.default.moveItem(at: tempPathURL, to: documentsDirectoryURL.appendingPathComponent(video.uuid))
            } catch {
                print("Error: \(error)")
            }
        })
        downloadTask.resume()

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вы используете неправильный URL для воспроизведения загруженного видео. Пожалуйста, внимательно проверьте код и обратите внимание, что вы используете URL-адрес каталога документов для проигрывателя, а не видео.

0 голосов
/ 22 января 2020

вы должны использовать fileURLWithPath для запуска видео из файлов приложения, например:

func PlayVideo() {

    let docPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]

    let player = AVPlayer(url: URL(fileURLWithPath: docPath).appendingPathComponent("IMG_3039.mp4"))

    let controller = AVPlayerViewController()
    controller.player = player

    self.present(controller, animated: true) {
        player.play()
    }
}
...