Как я могу установить байты видео, полученные из хранилища Firebase, в видеоплеер?

Я пытаюсь получить / загрузить видео из хранилища Firebase, чтобы использовать эти байты в плеере iOS, но у меня ничего не получается. Я получаю оттуда правильные данные (я использую отладку и получаю правильные байты, то есть 84611570), но я не могу использовать его с MPMoviePlayerController или AVPlayer, потому что оба используют подходы URL. Я попытался указать путь с сервера, но в хранилище нет синтаксиса https, есть несколько gs: // или что-то в этом роде. Мне нужно руководство о каком-то подходе, потому что я потерял много часов и не двигался дальше (загрузка 1%). Мой код находится ниже, чтобы кто-нибудь его проверил. Есть мысли, как преобразовать данные и поместить в плеер?

   func downloadVideo(filename:String){
    let downloadVideoReference = videoReference.child(filename)

    let dowloadTask = downloadVideoReference.getData(maxSize: 1024 * 1024 * 1024 * 1024) { (data, erro) in
        if data != nil {

            print(data)
            print(type(of: data))

     }
    }

}

person Guilherme Pedriconi    schedule 12.05.2020    source источник


Ответы (2)


Если вы хотите использовать HTTP-URL для передачи данных из Firebase Storage в проигрыватель, вам понадобится создать URL для загрузки. URL-адрес загрузки - это URL-адрес, который обеспечивает доступ только для чтения к данным для всех (у кого есть этот URL-адрес), поэтому вы можете установить его в проигрывателе.

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

person Frank van Puffelen    schedule 12.05.2020
comment
Спасибо, я потратил много часов на то, что, вероятно, никогда не сработает. Теперь я попытаюсь найти способ создать собственный проигрыватель, потому что я хочу разместить несколько комментариев и лайков под приложением. В любом случае, голосуйте за вас! - person Guilherme Pedriconi; 12.05.2020

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

let videoRef = storage.reference().child("video/\(uid).mp4")

let view = UIViewController()

videoRef.getData(maxSize: 10 * 1024 * 1024) { data, error in

  if let error = error {

    print("ERROR: \(error)")
    print("Did not find video!")

  } else {

    let tmpFileURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent("video").appendingPathExtension("mp4")
    do{
        try data!.write(to: tmpFileURL, options: [.atomic])
    }catch{
        print("error with video!")
    }

    let rect = CGRect(
        origin: CGPoint(x: 0, y: 0),
        size: self.myuiscreen.bounds.size
    )
    self.player1 = AVPlayer(url: tmpFileURL)

    let controller = AVPlayerLayer(player: self.player1)
    controller.player = self.player1
    self.player1!.isMuted = false

    do {
       try AVAudioSession.sharedInstance().setCategory(.playback)
    } catch(let error) {
        print(error.localizedDescription)
    }
    self.player1!.play()

    controller.videoGravity = AVLayerVideoGravity.resizeAspectFill
    controller.frame = rect
    view.view.layer.addSublayer(controller)

    //Where the video repeats
    NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player1?.currentItem, queue: .main) { _ in
        self.player1!.seek(to: CMTime.zero)
        self.player1!.play()
    }
  }
}
person ZachtheBoB    schedule 12.05.2020