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

Linda Hamilton
Lepaskan: 2024-11-01 05:02:02
asal
343 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!