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.
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.
Untuk menyelesaikan isu tersebut, langkah berikut telah diambil:
Sebagai alternatif , jika http.FileServe() tidak diutamakan, pengendalian permintaan julat tersuai boleh dilaksanakan. Ini melibatkan menetapkan pengepala berikut dalam respons:
Untuk permintaan Julat, pelayan harus mengembalikan kod status HTTP 206 Kandungan Separa dan bukannya 200 OK.
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!