Mit GoLang wurde ein Webserver erstellt, der HTML/JS/CSS und Bilder bereitstellt. Als der Server versuchte, eine MP4-Videodatei bereitzustellen, konnte das Video nicht geladen werden und es wurden nur Videosteuerelemente angezeigt.
Bei der Untersuchung der Videodateien wurde festgestellt, dass das kleinere Video funktionierte das größere Video nicht. Das Problem hing mit der Videogröße und dem Standardpufferverhalten des Browsers zusammen.
Range Request-Unterstützung:
Für Videos, die größer als eine bestimmte Größe sind, benötigt der Browser den Server zur Unterstützung von Bereichsanfragen (teilweise Bereitstellung von Inhalten). Dadurch kann der Browser nur den Teil des Videos abrufen, der für die Wiedergabe benötigt wird, wodurch verhindert wird, dass die gesamte Datei in den Speicher geladen wird.
In diesem Fall wurde der GoLang-Code nicht für die Verarbeitung von Bereichsanfragen konfiguriert. Die bereitgestellte Implementierung stellte lediglich die gesamte Datei als eine einzige Antwort bereit. Infolgedessen konnte der Browser das größere Video nicht abspielen.
Um das Problem zu beheben, wurden die folgenden Schritte unternommen:
Alternativ Wenn http.FileServe() nicht bevorzugt wird, kann eine benutzerdefinierte Bereichsanforderungsbehandlung implementiert werden. Dazu gehört das Setzen der folgenden Header in der Antwort:
Für Bereichsanfragen sollte der Server den HTTP-Statuscode 206 zurückgeben Teilinhalt statt 200 OK.
Die Behandlung benutzerdefinierter Bereichsanfragen wurde auf folgende Weise implementiert:
<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>
Looping-Video:
Um sicherzustellen, dass das Video in einer Schleife läuft, wurde die folgende Logik hinzugefügt:
<code class="go">if contentType == "video/mp4" { http.ServeFile(w, r, path) } else { w.Header().Add("Content-Type", contentType) w.Write(data) }</code>
Hierbei wird http.ServeFile() für MP4-Videos verwendet, das die Schleife korrekt verarbeitet.
Das obige ist der detaillierte Inhalt vonWarum kann mein GoLang-Webserver keine großen MP4-Videos bereitstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!