Maison > Article > développement back-end > Pourquoi mon serveur Web GoLang ne parvient-il pas à diffuser de grandes vidéos MP4 ?
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.
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.
Pour résoudre le problème, les étapes suivantes ont été suivies :
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 :
Pour les requêtes de plage, le serveur doit renvoyer un code d'état HTTP de 206 Contenu partiel au lieu de 200 OK.
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!