在Go lang服务器中流式传输视频

时间:2017-11-29 19:30:21

标签: go video-streaming html5-video

我已经编写了这个简单的http服务器来提供视频文件:

package main

import (
    "net/http"
    "os"
    "bytes"
    "io"
    "fmt"
)

func handler(w http.ResponseWriter, r *http.Request) {

rangeValue := r.Header.Get("range")
fmt.Println("Range:")
fmt.Println(rangeValue)

buf := bytes.NewBuffer(nil)
f, _ := os.Open("oceans_1.webm")
io.Copy(buf, f)           // Error handling elided for brevity.
f.Close()

w.Header().Set("Accept-Ranges","bytes")
w.Header().Set("Content-Type", "video/webm")
w.Header().Set("Content-Length","22074728")
w.Header().Set("Last-Modified", "Wed, 29 Nov 2017 17:10:44 GMT")

w.WriteHeader(206)
w.Write(buf.Bytes())
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

视频服务完美,但我无法更改视频的时间。当我点击时间轴视频光标时,它不会改变位置,视频也不会跳转到特定时间。

当我使用http.ServeFile(w, r, "oceans_1.webm")投放视频时,一切都很完美 - 我可以更改视频时间。

1 个答案:

答案 0 :(得分:0)

这个不同的行为直接针对net/http包,ServeContent的文档(强调我的):

  

ServeContent使用提供的ReadSeeker中的内容回复请求。 ServeContent对io.Copy的主要好处是它正确处理Range请求,设置MIME类型,并处理If-Match,If-Unmodified-Since,If-None-Match,If-Modified -Since,和If-Range请求。

如果您检查net/http代码,则会看到ServeFile来电serveContent(通过serveFile),这是{{3}调用的相同未导出函数}}

我没有深入研究不同行为的原因,但有关该程序包的文档清楚地说明了为什么io.Copy策略不起作用,而http.ServeFile则不行。