92 votes

Firebase Storage Video Streaming

Je travaille sur une application qui a une fonctionnalité de streaming vidéo. J'utilise la base de données Firebase et le stockage Firebase. J'essaie de trouver de la documentation sur la façon dont Firebase Storage gère les fichiers vidéo, mais je ne trouve pas grand-chose.

Il est mentionné dans la documentation que le stockage firebase fonctionne avec d'autres services d'applications google pour permettre le CDN et le streaming vidéo, mais toutes les recherches semblent mener à une impasse. Un conseil ?

3 votes

Pour autant que je sache, il n'existe pas d'intégrations préfabriquées entre Firebase Storage et les services de CDN ou de streaming vidéo. Pouvez-vous fournir un lien vers la documentation où vous avez vu cela ?

1 votes

"Firebase Storage stocke vos fichiers dans un seau Google Cloud Storage partagé avec l'application Google App Engine par défaut, ce qui les rend accessibles à la fois via Firebase et les API Google Cloud. Vous avez ainsi la possibilité de télécharger des fichiers à partir de clients mobiles via Firebase et d'effectuer des traitements côté serveur tels que le filtrage d'images ou le transcodage de vidéos à l'aide de Google Cloud Platform. " firebase.google.com/docs/storage/#key_functions

1 votes

J'essaie également de Firebase storage avec fastly, mais j'ai échoué sur la configuration du domaine. Je pense que l'hébergement Firebase peut fonctionner avec fastly, puisque l'hébergement Firebase a son propre CDN, je pense que c'est inutile avec l'hébergement Firebase.

77voto

Mike McDonald Points 8728

Je pense qu'il existe plusieurs types de streaming vidéo, ce qui pourrait changer notre réponse ici :

  • Diffusion en direct (les abonnés regardent un événement en direct)
  • Style Youtube (publiez une vidéo et les utilisateurs finaux la regardent à leur convenance)

Ayant construit une application de streaming en direct de type Periscope en utilisant Firebase Storage et la base de données Firebase Realtime, je vous le déconseille assez fortement - nous avons téléchargé des morceaux de trois secondes et les avons synchronisés via la base de données Realtime. Bien que cela ait fonctionné (étonnamment bien), il y avait une latence de ~5 secondes sur un très bon internet, et ce n'était pas non plus la solution la plus efficace (après tout, vous téléchargez et stockez cette vidéo, et il n'y avait pas de transcodage). Je recommande d'utiliser un style WebRTC, conçu pour le transport de la vidéo, et d'utiliser la base de données en temps réel pour la signalisation en parallèle du flux.

D'un autre côté, il est tout à fait possible de construire un YT mobile sur les fonctionnalités de Firebase. Le truc ici sera de transcoder la vidéo (en utilisant quelque chose comme Zencoder ou Bitmovin, plus ici : https://cloud.google.com/solutions/media/ ) pour découper votre vidéo téléchargée en petits morceaux de différentes résolutions (et de différents formats, iOS exigeant HLS pour la diffusion en continu, par exemple). Votre client peut stocker des informations sur les morceaux dans la base de données en temps réel (nom du morceau, résolutions disponibles, nombre de morceaux), et peut télécharger lesdits morceaux à partir du stockage au fur et à mesure de la progression de la vidéo.

2 votes

Merci pour ces conseils et pour avoir partagé votre expérience. Le besoin de mon application est plus proche de l'option 2. Les utilisateurs pourront télécharger de courts clips vidéo que d'autres utilisateurs pourront ensuite diffuser. J'ai effectivement lu l'article que vous m'avez envoyé l'autre jour, mais j'espérais qu'il y aurait une intégration plus étroite entre les deux services qui n'y est pas documentée. Il semble qu'avec le stockage Firebase et les prix de GCP pour ces tâches, je ferais mieux de chercher un autre service pour l'hébergement de vidéos. Je regarde Sprout Video et Vimeo Pro en ce moment.

2 votes

Je vérifierais ziggeo.com de même, ils sont assez faciles à utiliser et peuvent avoir tout ce dont vous avez besoin pour réussir dans cet espace.

7 votes

@gcas qu'est-ce que vous avez fini par utiliser exactement ? Je suis également dans le même bateau en utilisant firebase. Avez-vous utilisé le stockage firebase et le transcodage en utilisant un autre service (par exemple zencoder).

32voto

grant Points 621

Si vous voulez envoyer une vidéo à partir de Firebase Storage, c'est le meilleur moyen que j'ai trouvé. Cela dépendra de la taille de votre fichier vidéo. Je ne demande que des fichiers de 10-30mb donc cette solution fonctionne bien pour moi. Il suffit de traiter l'Url de Firebase comme une url normale :

String str = "fire_base_video_URL";
Uri uri = Uri.parse(str);

videoViewLandscape.setVideoURI(uri);
progressBarLandScape.setVisibility(View.VISIBLE);
videoViewLandscape.requestFocus();
videoViewLandscape.start();

Si vous voulez mettre la vidéo en boucle :

videoViewLandscape.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});

Et si vous voulez afficher une barre de progression avant le début de la vidéo, faites ceci :

videoViewLandscape.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
            progressBarLandScape.setVisibility(View.GONE);
            return true;
        }
        else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){
            progressBarLandScape.setVisibility(View.VISIBLE);
            return true;
        }
        return false;
    }
});

Ce n'est pas la meilleure façon de faire les choses, mais cela me convient pour l'instant, jusqu'à ce que je trouve un bon service de streaming vidéo.

4 votes

Est-ce que cela n'utilise pas de chunking ? On dirait presque qu'il suffit de faire pointer la source vidéo vers l'URL du fichier. Est-ce bien cela ? Est-ce que ça marche bien

1 votes

Les performances de ce système sont probablement nulles, à moins d'être en Wifi :p PS : désolé d'avoir mis 1,5 an à répondre @SeanMC

15voto

Skyy2010 Points 316

2020 : Oui, le streaming vidéo du stockage firebase est facile et possible.

Toutes les autres questions suggèrent d'utiliser un protocole comme HLS. Toutefois, cela n'est nécessaire que si vous développez une application destinée à l'AppStore d'Apple qui propose des vidéos de plus de 10 minutes.

Dans tous les autres cas, vous pouvez simplement encoder vos vidéos en mp4 et les télécharger sur firebase. Vos clients peuvent alors diffuser le mp4 sans problème. Assurez-vous simplement que votre atome moov se trouve au début de votre fichier mp4. Cela permet de lancer la lecture de la vidéo immédiatement, même si elle n'est pas entièrement chargée. Les utilisateurs peuvent également avancer ou reculer grâce aux requêtes à bit variable qui sont prises en charge par le stockage de firebase.

Pour le tester, il suffit de télécharger une vidéo sur votre stockage firebase et de l'ouvrir dans votre navigateur.

1 votes

Je me demande juste si la taille de la vidéo est de 1,4 Go. Si l'on regarde cette vidéo, alors lors du téléchargement, 1,4 Go est également compté en même temps ? (prix)

1 votes

C'est vrai, mais sans HLS (ou DASH), vous continuerez à gaspiller la bande passante des consommateurs car vous n'utiliserez pas de flux à résolution adaptative ; tous les appareils ne veulent pas ou n'ont pas besoin d'un flux 1080p.

2 votes

@Davie oui, c'est vrai. Vos coûts pourraient également bénéficier de HLS ou de DASH, car vous devez également payer pour cette bande passante.

14voto

user2942294 Points 31

Vous pouvez héberger des vidéos HLS sur Firebase Cloud Storage. Cela fonctionne assez bien pour moi. L'astuce consiste à modifier la liste de lecture .m3u8 pour contenir le préfixe du dossier de stockage, et les fichiers ?alt=media pour chaque entrée de fichier dans la liste de lecture :

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:2.760000,
<folder_name>%2F1_fileSequence_0.ts?alt=media
#EXT-X-ENDLIST

Vous n'avez pas non plus ont pour utiliser le transcodage côté serveur, vous pouvez demander au client qui télécharge la vidéo de le faire, et économiser ainsi des coûts considérables.

J'ai écrit un tutoriel complet avec le code source ici : https://itnext.io/how-to-make-a-serverless-flutter-video-sharing-app-with-firebase-storage-including-hls-and-411e4fff68fa

2 votes

Bonjour, savez-vous ce qui se passe en termes de tarification Firebase lorsque nous avons une vidéo HLS de 200MB en morceaux de 10MB et que l'utilisateur n'a regardé/bufflé que la moitié de la vidéo ? Est-ce qu'ils nous facturent la moitié du coût total du Mo ? Deuxièmement, en ce qui concerne Flutter, HLS est tout ce dont nous avons besoin pour iOS et Android, n'est-ce pas ? il n'y a pas besoin de DASH.

0 votes

Comment gérer la sécurité avec ces morceaux de fichiers vidéo et de fichiers m3u8 ? Disons que je ne veux pas que certains utilisateurs aient accès à certains fichiers vidéo. Est-ce possible ? Enfin, devons-nous utiliser Firebase Cloud Storage ? Pourrions-nous plutôt utiliser Firebase Storage ?

0 votes

En ce qui concerne le prix, vous avez probablement raison, vous n'êtes facturé que pour ce qui est récupéré de firebase, et avec HLS vous ne récupérez que les quelques morceaux suivants.

1voto

Zachary Smith Points 91

C'est l'implémentation exacte que j'ai faite pour lancer la lecture d'une vidéo à partir d'un stockage sur firebase dès que la vue est ouverte, puis faire disparaître la vue et ajouter un bouton à cliquer après pour rejouer la vidéo.

J'ai un lien de démonstration avec la clé afin que vous puissiez voir qu'il fonctionne. toutes les questions hit me up.

vous devrez simplement créer une IBAction si vous voulez que le bouton après la disparition de la vidéo.

//  BackMuscles.swift
//  Messenger
//
//  Created by Zach Smith on 8/12/21.
//  Copyright © 2021 spaceMuleFitness. All rights reserved.
//

import UIKit
import AVKit
import AVFoundation

class BackMuscles: UIViewController {

    @IBOutlet weak var playv: UIButton!

    let avPlayerViewController = AVPlayerViewController()
    var avPlayer:AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addBackground()

        let movieUrl:NSURL? = NSURL(string: "https://firebasestorage.googleapis.com/v0/b/messenger-test-d225b.appspot.com/o/test%2FTestVideo.mov?alt=media&token=bd4ccba3-b446-43bc-809e-b1152aa3c2ff")
        if let url = movieUrl {
        self.avPlayer = AVPlayer(url: url as URL)
        self.avPlayerViewController.player = self.avPlayer
        }
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: avPlayerViewController.player?.currentItem)

        self.present(self.avPlayerViewController, animated: true) { () -> Void in
                self.avPlayerViewController.player?.play()        // Do any additional setup after loading the view.
        }
    }

    @objc func playerDidFinishPlaying(note: NSNotification) {
            self.avPlayerViewController.dismiss(animated: true)
        }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
    @IBAction func playV(sender: UIButton) {

                let amovieUrl:NSURL? = NSURL(string: "https://firebasestorage.googleapis.com/v0/b/messenger-test-d225b.appspot.com/o/test%2FTestVideo.mov?alt=media&token=bd4ccba3-b446-43bc-809e-b1152aa3c2ff")
                if let aurl = amovieUrl {
                    self.avPlayer = AVPlayer(url: aurl as URL)
                self.avPlayerViewController.player = self.avPlayer

    self.present(self.avPlayerViewController, animated: true) { () -> Void in
            self.avPlayerViewController.player?.play()

    }

    }
}
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X