>  기사  >  백엔드 개발  >  내 GoLang 웹서버가 대용량 MP4 비디오를 제공하지 못하는 이유는 무엇입니까?

내 GoLang 웹서버가 대용량 MP4 비디오를 제공하지 못하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 05:02:02344검색

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

MP4 비디오를 제공하는 GoLang HTTP 웹서버

도전

HTML/JS/CSS 및 이미지를 제공하는 GoLang을 사용하여 웹서버를 만들었습니다. 서버가 MP4 비디오 파일을 제공하려고 시도했을 때 비디오가 로드되지 않고 비디오 컨트롤만 표시되었습니다.

조사

비디오 파일을 조사한 결과 더 작은 비디오는 작동하는 것으로 나타났습니다. 더 큰 비디오는 그렇지 않았습니다. 문제는 비디오 크기 및 브라우저의 기본 버퍼링 동작과 관련이 있습니다.

범위 요청 지원:

특정 크기보다 큰 비디오의 경우 브라우저에 서버가 필요합니다. Range 요청을 지원합니다(부분 콘텐츠 제공). 이를 통해 브라우저는 재생에 필요한 비디오 부분만 가져올 수 있으므로 전체 파일이 메모리에 로드되는 것을 방지할 수 있습니다.

이 경우 GoLang 코드는 Range 요청을 처리하도록 구성되지 않았습니다. 제공된 구현은 단순히 전체 파일을 단일 응답으로 제공했습니다. 그 결과 브라우저에서 더 큰 동영상을 재생할 수 없었습니다.

해결 방법

이 문제를 해결하기 위해 다음 단계를 수행했습니다.

  1. http.FileServe() 사용: http.FileServe() 메서드는 기본적으로 Range 요청을 처리합니다. 이 방법을 사용하여 비디오 파일을 제공함으로써 서버는 부분 콘텐츠를 브라우저에 제공할 수 있었습니다.
  2. 사용자 정의 범위 요청 처리 구성:

또는 , http.FileServe()가 선호되지 않는 경우 사용자 정의 범위 요청 처리를 구현할 수 있습니다. 여기에는 응답에 다음 헤더를 설정하는 작업이 포함됩니다.

  • Accept-Ranges: bytes
  • Content-Length(파일 크기)
  • Content-Range(bytes) 범위 요청)
  1. HTTP 상태 코드 206 사용:

범위 요청의 경우 서버는 HTTP 상태 코드 206을 반환해야 합니다. 200 대신 부분 콘텐츠 OK.

구현

사용자 정의 범위 요청 처리가 다음 방식으로 구현되었습니다.

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

루핑 비디오:

동영상 루프를 보장하기 위해 다음 로직이 추가되었습니다.

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

이는 MP4 비디오용 http.ServeFile()을 사용하여 루프를 올바르게 처리합니다.

위 내용은 내 GoLang 웹서버가 대용량 MP4 비디오를 제공하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.