«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему мой веб-сервер GoLang не может обслуживать большие видео в формате MP4?

Почему мой веб-сервер GoLang не может обслуживать большие видео в формате MP4?

Опубликовано 8 ноября 2024 г.
Просматривать:152

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

Веб-сервер GoLang HTTP, обслуживающий видео MP4

Задание

Веб-сервер был создан с использованием GoLang, который обслуживает HTML/JS/CSS и изображения. Когда сервер попытался предоставить видеофайл MP4, видео не удалось загрузить, и были показаны только элементы управления видео.

Расследование

После изучения видеофайлов было обнаружено, что видео меньшего размера работало, пока более крупное видео этого не сделало. Проблема была связана с размером видео и поведением буферизации браузера по умолчанию.

Поддержка запроса диапазона:

Для видео, размер которых превышает определенный, браузеру требуется сервер для поддержки запросов Range (частичная отправка контента). Это позволяет браузеру получать только ту часть видео, которая необходима для воспроизведения, предотвращая загрузку всего файла в память.

В этом случае код GoLang не был настроен для обработки запросов диапазона. Предоставленная реализация просто обрабатывала весь файл как один ответ. В результате браузер не смог воспроизвести видео большего размера.

Решение

Для решения проблемы были предприняты следующие шаги:

  1. Используйте http.FileServe(): Метод http.FileServe() по умолчанию обрабатывает запросы диапазона. Используя этот метод для обслуживания видеофайла, сервер смог предоставить браузеру частичный контент.
  2. Настроить обработку запросов пользовательского диапазона:

Альтернативно , если http.FileServe() не является предпочтительным, можно реализовать обработку запросов пользовательского диапазона. Это предполагает установку следующих заголовков в ответе:

  • Accept-Ranges: bytes
  • Content-Length (размер файла)
  • Content-Range (байты запрошенный диапазон)
  1. Использовать код состояния HTTP 206:

Для запросов диапазона сервер должен возвращать код состояния 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