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.
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.
Pour résoudre le problème, les étapes suivantes ont été suivies :
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 :
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 :
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.
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