Веб-сервер был создан с использованием GoLang, который обслуживает HTML/JS/CSS и изображения. Когда сервер попытался предоставить видеофайл MP4, видео не удалось загрузить, и были показаны только элементы управления видео.
После изучения видеофайлов было обнаружено, что видео меньшего размера работало, пока более крупное видео этого не сделало. Проблема была связана с размером видео и поведением буферизации браузера по умолчанию.
Поддержка запроса диапазона:
Для видео, размер которых превышает определенный, браузеру требуется сервер для поддержки запросов Range (частичная отправка контента). Это позволяет браузеру получать только ту часть видео, которая необходима для воспроизведения, предотвращая загрузку всего файла в память.
В этом случае код GoLang не был настроен для обработки запросов диапазона. Предоставленная реализация просто обрабатывала весь файл как один ответ. В результате браузер не смог воспроизвести видео большего размера.
Для решения проблемы были предприняты следующие шаги:
Альтернативно , если http.FileServe() не является предпочтительным, можно реализовать обработку запросов пользовательского диапазона. Это предполагает установку следующих заголовков в ответе:
Для запросов диапазона сервер должен возвращать код состояния HTTP 206 Partial Content вместо 200 OK.
Пользовательский диапазон обработка запросов была реализована следующим образом:
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)))
}
}
Циклическое видео:
Чтобы обеспечить зацикливание видео, была добавлена следующая логика:
if contentType == "video/mp4" {
http.ServeFile(w, r, path)
} else {
w.Header().Add("Content-Type", contentType)
w.Write(data)
}
При этом используется http.ServeFile() для видео MP4, который правильно обрабатывает циклическое воспроизведение.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3