Maison  >  Article  >  développement back-end  >  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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 05:02:02343parcourir

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.

Support de demande 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 servir le fichier vidéo, le serveur a pu fournir un contenu partiel au navigateur.
  2. Configurer la gestion des demandes de plage personnalisée :

Alternative , 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. Utilisez 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.

Mise en œuvre

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

<code class="go">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)))
    }
}</code>

Vidéo en boucle :

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

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn