Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah pelayan web GoLang saya gagal menyiarkan video MP4 yang besar?

Mengapakah pelayan web GoLang saya gagal menyiarkan video MP4 yang besar?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 05:02:02344semak imbas

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

Pelayan Web HTTP GoLang Menyajikan Video MP4

Cabaran

Pelayan web dicipta menggunakan GoLang yang menyediakan HTML/JS/CSS dan imej. Apabila pelayan cuba menyediakan fail video MP4, video gagal dimuatkan, hanya menunjukkan kawalan video.

Penyiasatan

Setelah memeriksa fail video, didapati bahawa video yang lebih kecil berfungsi semasa video yang lebih besar tidak. Isu ini berkaitan dengan saiz video dan gelagat penimbalan lalai penyemak imbas.

Sokongan Permintaan Julat:

Untuk video yang lebih besar daripada saiz tertentu, penyemak imbas memerlukan pelayan untuk menyokong permintaan Julat (siaran kandungan separa). Ini membenarkan penyemak imbas untuk mengambil bahagian video sahaja yang diperlukan untuk main balik, menghalang keseluruhan fail daripada dimuatkan ke dalam memori.

Dalam kes ini, kod GoLang tidak dikonfigurasikan untuk mengendalikan permintaan Julat. Pelaksanaan yang disediakan hanya menyampaikan keseluruhan fail sebagai satu respons. Akibatnya, penyemak imbas tidak dapat memainkan video yang lebih besar.

Penyelesaian

Untuk menyelesaikan isu tersebut, langkah berikut telah diambil:

  1. Gunakan http.FileServe(): Kaedah http.FileServe() mengendalikan permintaan Julat secara lalai. Dengan menggunakan kaedah ini untuk menyampaikan fail video, pelayan dapat menyediakan sebahagian kandungan kepada penyemak imbas.
  2. Konfigurasikan Pengendalian Permintaan Julat Tersuai:

Sebagai alternatif , jika http.FileServe() tidak diutamakan, pengendalian permintaan julat tersuai boleh dilaksanakan. Ini melibatkan menetapkan pengepala berikut dalam respons:

  • Julat-Terima: bait
  • Panjang Kandungan (saiz fail)
  • Julat-Kandungan (bait julat diminta)
  1. Gunakan Kod Status HTTP 206:

Untuk permintaan Julat, pelayan harus mengembalikan kod status HTTP 206 Kandungan Separa dan bukannya 200 OK.

Pelaksanaan

Pengendalian permintaan julat tersuai telah dilaksanakan dengan cara berikut:

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

Video Gelung:

Untuk memastikan bahawa video bergelung, logik berikut telah ditambahkan:

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

Ini menggunakan http.ServeFile() untuk video MP4, yang mengendalikan gelung dengan betul.

Atas ialah kandungan terperinci Mengapakah pelayan web GoLang saya gagal menyiarkan video MP4 yang besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn