HTML/JS/CSS 및 이미지를 제공하는 GoLang을 사용하여 웹서버를 만들었습니다. 서버가 MP4 비디오 파일을 제공하려고 시도했을 때 비디오가 로드되지 않고 비디오 컨트롤만 표시되었습니다.
비디오 파일을 조사한 결과 더 작은 비디오는 작동하는 것으로 나타났습니다. 더 큰 비디오는 그렇지 않았습니다. 문제는 비디오 크기 및 브라우저의 기본 버퍼링 동작과 관련이 있습니다.
범위 요청 지원:
특정 크기보다 큰 비디오의 경우 브라우저에 서버가 필요합니다. Range 요청을 지원합니다(부분 콘텐츠 제공). 이를 통해 브라우저는 재생에 필요한 비디오 부분만 가져올 수 있으므로 전체 파일이 메모리에 로드되는 것을 방지할 수 있습니다.
이 경우 GoLang 코드는 Range 요청을 처리하도록 구성되지 않았습니다. 제공된 구현은 단순히 전체 파일을 단일 응답으로 제공했습니다. 그 결과 브라우저에서 더 큰 동영상을 재생할 수 없었습니다.
이 문제를 해결하기 위해 다음 단계를 수행했습니다.
또는 , http.FileServe()가 선호되지 않는 경우 사용자 정의 범위 요청 처리를 구현할 수 있습니다. 여기에는 응답에 다음 헤더를 설정하는 작업이 포함됩니다.
범위 요청의 경우 서버는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!