RTMPストリーミングメディアプロトコルインターネットライブ/オンデマンドプラットフォームEasyDSSは、ReverseProxyを使用してflvストリームを中断し、ブロードキャストを自動的に停止する効果をどのように実現しますか?

Qingxiビデオをフォローしている友人は、EasyGBSがデモプラットフォームで3分以上経過すると自動的にブロードキャストを停止するように設定できることを他のブログ投稿で述べたことを知っているはずです。実際、EasyDSSの開発中に、これにも遭遇しました要件の種類:一定期間プレイした後、自動的にシャットダウンします。

EasyDSS加水印.png

EasyDSSのflvストリームの内部設計は、カーネルがflvサービスを提供し、アプリケーションレイヤーがリバースプロキシを実行して、ブラウザーレイヤーにflvサービスを提供します。つまり、ブラウザーがflvストリームを要求すると、ブラウザーは最初にアプリケーション層を通過し、アプリケーション層がflvストリーム要求を受信した後、要求をカーネルにリバースプロキシし、最後にflv要求を提供します。

DSS7.png

ユーザーのニーズに応じて、アプリケーション層のリバースプロキシで構成された中断時間に従って、flvストリームを自動的に中断する必要があります。アプリケーションレイヤーはGoで開発され、次のコードがリバースプロキシに使用されます。

proxy := &httputil.ReverseProxy{
   Director:     director,
   Transport:    tranport,
   ErrorHandler: errHandle,
}
// 反向代理
proxy.ServeHTTP(c.Writer, c.Request)

トランスポートはデータ伝送に使用されるストリームです。伝送チャネルで応答データを取得するだけで済みます。中断時間の後、応答を閉じてストリーム伝送を中断します。
Go言語のトランスポートコードを見ると、応答を取得するためのインターフェイスが提供されていないため、応答データを取得するためにトランスポートインターフェイスを再パッケージする必要があります。

// 可关闭 Transport
type ShutDownTransport struct {
   Trans    *http.Transport
   response *http.Response
}

// 覆盖上层 Transport
func (t *ShutDownTransport) RoundTrip(req *http.Request) (*http.Response, error) {
   res, err := t.Trans.RoundTrip(req)
   t.response = res
   return res, err
}

// 实现关闭方法
func (t *ShutDownTransport) ShutDown(d time.Duration) {
   time.AfterFunc(d, func() {
      res := t.response
      if res != nil {
         if res.Body != nil {
            res.Body.Close()
         }
      }
   })
}

上記のコードは、組み合わせモードを使用してhttp.Transportと http.Responseを構造に組み合わせ、RoundTrip()メソッドを実装します。RoundTrip()メソッドは、エージェントが実装する必要があるメソッドであり、そこから対応する応答を取得できます。

ShutDown()メソッドでタイミング操作を開始し、d時間後にresponse.Body.Close()メソッドを呼び出してストリーム送信を強制的に中断することで、この機能を実現します。ビデオ関連のソリューションの詳細については、TSINGSEE Qingxi Videoにアクセスして理解してください。お気軽にご相談ください。

DSS2.png

おすすめ

転載: blog.csdn.net/EasyDSS/article/details/108648494