gpt4 book ai didi

video-streaming - 视频流中的导航,golang 中的反向代理

转载 作者:IT王子 更新时间:2023-10-29 01:48:28 24 4
gpt4 key购买 nike

我正在 go 中测试反向代理。主要用于通过底层nginx播放视频和从其他后端服务器流式传输视频。

问题出在浏览视频时。例如,当通过代理播放 vlc 时 - 视频正常启动,但在尝试导航时停止。但是如果我直接从 nginx 播放这个视频 - 它工作正常。

我预计在导航播放器上会创建与 Range: N- header 的新连接,但没有新连接,只有在再次开始播放视频时才会出现。

问题:

播放视频流时,播放器如何导航?它向服务器发送什么请求?也许我在连接处理中遗漏了什么?

这是用于测试的非常基础的版本,它从本地 nginx 流式传输视频,(本地视频 url - http://localhost/31285611):

package main

import (
"net/http"
)

func main() {
(&proxy{}).start()
}

type proxy struct {
// ...
}

func (p *proxy) start() {
http.HandleFunc("/play", p.connection)
http.ListenAndServe("localhost:8040", nil)
}

func (p *proxy) connection(w http.ResponseWriter, r *http.Request) {
disconnect := make(chan bool, 1)
go p.send(w, r, disconnect)

// ...

<-disconnect
}


func (p *proxy) send(rv http.ResponseWriter, rvq *http.Request, disconnect chan bool) {

rq, _ := http.NewRequest("GET", "http://localhost/31285611", rvq.Body)
rq.Header = rvq.Header

rs, _ := http.DefaultClient.Do(rq)
for k, v := range rs.Header {
rv.Header().Set(k, v[0])
}
rv.WriteHeader(http.StatusOK)

buf := make([]byte, 1024)

// for testing sending only first part.
for i := 0; i < 100000; i++ {
n, e := rs.Body.Read(buf[0:])
if n == 0 || e != nil {
break
}
rv.Write(buf[0:])
}

disconnect <- true

}

更新( header 转储):

第一个玩家连接:

map[User-Agent:[VLC/2.0.0 LibVLC/2.0.0] Range:[bytes=0-] Connection:[close] Icy-Metadata:[1]]

在 go 中创建连接时来自 nginx 的响应:

map[Server:[nginx/1.3.4] Date:[Tue, 23 Apr 2013 13:29:00 GMT] Content-Type:[application/octet-stream] Content-Length:[8147855699] Last-Modified:[Tue, 21 Aug 2012 20:47:20 GMT] Etag:["5033f3d8-1e5a66953"] Content-Range:[bytes 0-8147855698/8147855699]]

最佳答案

我知道它并没有真正回答你的问题(而且我还没有足够的评论点,很抱歉提供这个作为答案!)但你是否尝试过使用 Go 内置的 http.ReverseProxy ( http://golang.org/pkg/net/http/httputil/#ReverseProxy ) ?

这里似乎有一个不错的简单示例 https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/1ufEw_IEVM4我在下面非常稍微修改了一下:

package main

import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)

func main() {
proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: "http", Host: "www.google.com", Path: "/"})

err := http.ListenAndServe(":8080", proxy)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

看看这样做是否有效。

此外,在之前链接的 Google Groups 讨论中,提到了 NginX 在分 block 编码方面存在问题。可能值得检查这是否相关。

关于video-streaming - 视频流中的导航,golang 中的反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16172090/

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