Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann mein GoLang-Webserver keine großen MP4-Videos bereitstellen?

Warum kann mein GoLang-Webserver keine großen MP4-Videos bereitstellen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-01 05:02:02343Durchsuche

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

GoLang HTTP Webserver zur Bereitstellung von MP4-Videos

Herausforderung

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.

Untersuchung

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.

Lösung

Um das Problem zu beheben, wurden die folgenden Schritte unternommen:

  1. Verwenden Sie http.FileServe(): Die Methode http.FileServe() verarbeitet standardmäßig Bereichsanfragen. Durch die Verwendung dieser Methode zur Bereitstellung der Videodatei konnte der Server Teilinhalte für den Browser bereitstellen.
  2. Benutzerdefinierte Bereichsanforderungsverarbeitung konfigurieren:

Alternativ Wenn http.FileServe() nicht bevorzugt wird, kann eine benutzerdefinierte Bereichsanforderungsbehandlung implementiert werden. Dazu gehört das Setzen der folgenden Header in der Antwort:

  • Accept-Ranges: Bytes
  • Content-Length (Größe der Datei)
  • Content-Range (Bytes Bereich angefordert)
  1. HTTP-Statuscode 206 verwenden:

Für Bereichsanfragen sollte der Server den HTTP-Statuscode 206 zurückgeben Teilinhalt statt 200 OK.

Implementierung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn