【问题标题】:Stream video in Go lang server在 Go 语言服务器中流式传输视频
【发布时间】:2018-05-13 14:38:15
【问题描述】:

我编写了这个简单的 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") 提供视频时,一切正常 - 我可以更改视频时间。

【问题讨论】:

标签: go video-streaming html5-video


【解决方案1】:

这种不同的行为直接在 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),这与ServeContent 调用的未导出函数相同。

我没有深入研究导致不同行为的原因,但是包上的文档非常清楚地说明了为什么您的 io.Copy 策略不起作用,而 http.ServeFile 却起作用。

【讨论】:

  • 顺便说一句,正如@icza 在对原始问题的评论中所说,这种不同行为的原因(我没有深入研究)在this other SO answer 中有明确解释。
猜你喜欢
  • 2017-07-08
  • 2019-02-25
  • 2011-01-14
  • 2021-06-19
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多