首頁  >  文章  >  後端開發  >  為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?

為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?

Linda Hamilton
Linda Hamilton原創
2024-11-01 05:02:02344瀏覽

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

GoLang HTTP Web 伺服器提供 MP4 視訊

挑戰

使用 GoLang 建立了一個提供 HTML/JS/CSS 和圖片的 Web 伺服器。當伺服器嘗試提供 MP4 視訊檔案時,視訊載入失敗,僅顯示視訊控制。

調查

檢查視訊檔案後,發現較小的影片可以正常運作,而較大的影片則沒有。該問題與影片大小和瀏覽器的預設緩衝行為有關。

範圍請求支援:

對於大於特定大小的視頻,瀏覽器需要伺服器支援範圍請求(部分內容服務)。這允許瀏覽器僅獲取播放所需的影片部分,從而防止整個檔案載入到記憶體中。

在這種情況下,GoLang 程式碼未配置為處理 Range 請求。所提供的實作只是將整個文件作為單一回應提供。因此,瀏覽器無法播放較大的影片。

解決方案

為了解決問題,採取了以下步驟:

  1. 使用http.FileServe(): http.FileServe( )方法預設處理Range請求。透過使用此方法提供視訊文件,伺服器能夠向瀏覽器提供部分內容。
  2. 設定自訂範圍請求處理:

或者,如果不首選 http.FileServe(),則可以實現自訂範圍請求處理。這涉及在回應中設定以下標頭:

  • Accept-Ranges: bytes
  • Content-Length(檔案大小)
  • Content-Range(位元組) range request)
  1. 使用HTTP 狀態碼206:

對於Range 請求,伺服器應傳回HTTP 狀態碼200 OK。

實作

自訂範圍請求處理是透過以下方式實現的:

<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>

循環影片:

為了確保視訊循環,增加了以下邏輯:

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

這對MP4影片使用 http.ServeFile(),它可以正確處理循環。

以上是為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn