gpt4 book ai didi

go - 如何在Go中手动代理应用程序/八位字节流(实时视频)?

转载 作者:行者123 更新时间:2023-12-01 21:14:43 25 4
gpt4 key购买 nike

我正在尝试构建一个应用程序,该应用程序将充当具有缓存功能的流代理服务器。问题是,我想手动执行操作而不使用NewSingleHostReverseProxy。手动意味着执行以下步骤:

  • 对服务器
  • 执行单个 GET请求
  • 读取resp.Body以缓冲并写入连接的客户端

  • 问题是VLC没有播放任何内容。如果我直接访问流-VLC可以毫无问题地播放它,但是如果我通过GO进行操作-VLC(以及Kodi)只是保持缓冲并且永远不会开始播放。

    我尝试过但无法解决的问题:
  • io.Copy(...)
  • bufio读取器/扫描器,并写入连接的客户端。冲洗也无济于事。

  • 这是 curl -v <stream_url>所说的(直接访问流URL):
    ...
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 200 Ok
    < Server: Myserver
    < Cache-Control: no-cache
    < Pragma: no-cache
    < Content-Type: application/octet-stream
    < Access-Control-Allow-Origin: *
    < Connection: close
    <
    Warning: Binary output can mess up your terminal. Use "--output -" to tell
    Warning: curl to output it to your terminal anyway, or consider "--output
    Warning: <FILE>" to save to a file.
    * Failed writing body (0 != 2896)
    * Closing connection 0

    这是 curl -v <my_app_url>所说的:
    ...
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 200 OK
    < Access-Control-Allow-Origin: *
    < Cache-Control: no-cache
    < Content-Type: application/octet-stream
    < Pragma: no-cache
    < Server: Myserver
    < Date: Sun, 29 Dec 2019 09:13:44 GMT
    < Transfer-Encoding: chunked
    <
    Warning: Binary output can mess up your terminal. Use "--output -" to tell
    Warning: curl to output it to your terminal anyway, or consider "--output
    Warning: <FILE>" to save to a file.
    * Failed writing body (0 != 14480)
    * Failed reading the chunked-encoded stream
    * Closing connection 0

    似乎问题出在这里,但是我该如何解决?

    好:
    * Failed writing body (0 != 2896)
    * Closing connection 0

    坏:
    * Failed writing body (0 != 14480)
    * Failed reading the chunked-encoded stream
    * Closing connection 0

    另外还添加源代码,例如:
    func main() {
    http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
    resp, err := http.Get("http://example.com/stream/videostream")
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()
    reader := bufio.NewReader(resp.Body)
    buf := make([]byte, 1024)
    for {
    k, _ := reader.Read(buf)
    if k == 0 {
    break
    }
    w.Write(buf)
    }
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
    }

    最佳答案

    我正在构建一个动态的M3U播放列表,并在每个链接上添加.m3u8结尾。所有链接都是未知类型,因此我认为媒体播放器将只查看Content-Type并相应地处理媒体,但实际上,它们也查看URL结尾(无论URL是否包含.m3u8)。

    如果您将链接放在.m3u8的末尾,然后将该链接的Content-Type设置为application/octet-stream并提供实际的application/octet-stream流-播放器将永远不会开始显示任何视频流。解决方案-如果该URL不是.m3u8格式的媒体,请勿将m3u8附加到URL。没有m3u8,媒体播放器仍然可以播放视频。

    关于go - 如何在Go中手动代理应用程序/八位字节流(实时视频)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518175/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com