"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi mon serveur Web GoLang ne parvient-il pas à diffuser de grandes vidéos MP4 ?

Pourquoi mon serveur Web GoLang ne parvient-il pas à diffuser de grandes vidéos MP4 ?

Publié le 2024-11-08
Parcourir:898

Why does my GoLang webserver fail to serve large MP4 videos?

Serveur Web HTTP GoLang servant des vidéos MP4

Défi

Un serveur Web a été créé à l'aide de GoLang qui sert du HTML/JS/CSS et des images. Lorsque le serveur a tenté de fournir un fichier vidéo MP4, la vidéo n'a pas pu se charger, affichant uniquement les commandes vidéo.

Enquête

En examinant les fichiers vidéo, il a été découvert que la vidéo plus petite fonctionnait pendant la vidéo plus grande ne l'a pas fait. Le problème était lié à la taille de la vidéo et au comportement de mise en mémoire tampon par défaut du navigateur.

Prise en charge des demandes de plage :

Pour les vidéos supérieures à une certaine taille, le navigateur nécessite le serveur pour prendre en charge les requêtes Range (service de contenu partiel). Cela permet au navigateur de récupérer uniquement la partie de la vidéo nécessaire à la lecture, empêchant ainsi le chargement de l'intégralité du fichier en mémoire.

Dans ce cas, le code GoLang n'a pas été configuré pour gérer les requêtes Range. L'implémentation fournie a simplement servi l'intégralité du fichier comme une seule réponse. Par conséquent, le navigateur n'a pas pu lire la vidéo plus grande.

Solution

Pour résoudre le problème, les étapes suivantes ont été suivies :

  1. Utilisez http.FileServe() : La méthode http.FileServe() gère les requêtes Range par défaut. En utilisant cette méthode pour diffuser le fichier vidéo, le serveur a pu fournir un contenu partiel au navigateur.
  2. Configurer la gestion des demandes de plage personnalisée :

Alternativement , si http.FileServe() n'est pas préféré, une gestion des demandes de plage personnalisée peut être implémentée. Cela implique de définir les en-têtes suivants dans la réponse :

  • Accept-Ranges : octets
  • Content-Length (taille du fichier)
  • Content-Range (octets plage demandée)
  1. Utiliser le code d'état HTTP 206 :

Pour les requêtes de plage, le serveur doit renvoyer un code d'état HTTP de 206 Contenu partiel au lieu de 200 OK.

Implémentation

La gestion des demandes de plage personnalisée a été implémentée de la manière suivante :

func (vh *viewHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path[1:]
    data, err := ioutil.ReadFile(string(path))

    if err == nil {

        var contentType string

        if strings.HasSuffix(path, ".mp4") {
            contentType = "video/mp4"
            size := binary.Size(data)
            if size > 0 {
                requestedBytes := r.Header.Get("Range")
                w.Header().Add("Accept-Ranges", "bytes")
                w.Header().Add("Content-Length", strconv.Itoa(size))
                w.Header().Add("Content-Range", "bytes " requestedBytes[6:len(requestedBytes)] strconv.Itoa(size-1) "/" strconv.Itoa(size))
                w.WriteHeader(206)
            }
        } else {
            w.Header().Add("Content-Type", contentType)
            w.Write(data)
        }
    } else {
        log.Println("ERROR!")
        w.WriteHeader(404)
        w.Write([]byte("404 - "   http.StatusText(404)))
    }
}

Vidéo en boucle :

Pour garantir que la vidéo boucle, la logique suivante a été ajoutée :

if contentType == "video/mp4" {
    http.ServeFile(w, r, path)
} else {
    w.Header().Add("Content-Type", contentType)
    w.Write(data)
}

Ceci utilise http.ServeFile() pour les vidéos MP4, qui gère correctement la boucle.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3