Sim*_*mon 10 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)
}
Run Code Online (Sandbox Code Playgroud)
该视频服务完美,但我无法更改视频的时间.当我点击时间轴视频光标时,它不会改变位置,视频也不会跳转到特定时间.
当我使用http.ServeFile(w, r, "oceans_1.webm")一切完美的服务视频时,我可以改变视频时间.
这种不同的行为直接在包中的ServeContentnet/http文档中得到解决(强调我的):
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),这与 调用的未导出函数相同ServeContent。
我还没有深入研究不同行为的原因,但包上的文档非常清楚地说明了为什么你的io.Copy策略不起作用,而策略却http.ServeFile起作用。