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

Posted

技术标签:

【中文标题】视频流中的导航,golang中的反向代理【英文标题】:navigation in video stream, reverse proxy in golang 【发布时间】:2013-04-23 14:33:56 【问题描述】:

我正在测试一个反向代理。主要用于通过底层 nginx 播放视频和来自其他后端服务器的流式视频。

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

我预计导航播放器会创建带有Range: N- 标头的新连接,但没有新连接,只有在重新开始视频时才会出现。

问题:

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

这是一个非常基本的测试版本,它从本地 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


更新(标头转储):

第一个玩家连接:

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]]

【问题讨论】:

你为什么不转储标题并观察玩家在做什么? 我做到了,只是从代码中删除了和平(现在将发布标头转储),正如我所写 - 在播放器中导航时没有新连接 您找到解决方案了吗?我正在尝试做类似的事情:***.com/questions/59518175 【参考方案1】:

我知道它并没有真正回答你的问题(而且我还没有足够的评论点,很抱歉提供这个作为答案!)但是你是否尝试过使用 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.URLScheme: "http", Host: "www.google.com", Path: "/")

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

看看这是否有效。

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

【讨论】:

请在发帖前检查您的工作。这不编译。 err.String() 不存在,http.URL 也不存在 @utdrmac 抱歉,这个答案已经超过 6 年了!我已经用一个工作的例子更新了这个例子。感谢您的提醒!

以上是关于视频流中的导航,golang中的反向代理的主要内容,如果未能解决你的问题,请参考以下文章

golang 实现HTTP代理和反向代理

golang实现正/反向代理服务

golang http proxy反向代理

golang 反向代理reverseproxy源码分析

由于 CORS,Nginx 反向代理后面的 Golang 应用程序不会接受 ajax 请求

反向导航阴影属性和代理