¿Cómo utiliza el protocolo de medios de transmisión RTMP la plataforma en vivo / bajo demanda de Internet EasyDSS para interrumpir el flujo de flv para lograr el efecto de detener automáticamente la transmisión?

Los amigos que siguen el video de Qingxi deben saber que hemos mencionado en otras publicaciones del blog que EasyGBS se puede configurar para que deje de transmitir automáticamente después de más de tres minutos en la plataforma de demostración. De hecho, durante el desarrollo de EasyDSS, también encontramos esto Tipo de requisito: se apaga automáticamente después de jugar durante un período de tiempo.

Marca de agua EasyDSS.png

El diseño interno del flujo flv de EasyDSS es: el kernel proporciona servicios flv y la capa de aplicación realiza un proxy inverso para proporcionar servicios flv para la capa del navegador. Es decir, cuando el navegador solicita el flujo de flv, primero pasa a través de la capa de aplicación. Después de que el nivel de aplicación recibe la solicitud de flujo de flv, realiza un proxy inverso de la solicitud al kernel y finalmente proporciona la solicitud de flv.

DSS7.png

Según las necesidades del usuario, es necesario interrumpir automáticamente el flujo de flv según el tiempo de interrupción configurado en el proxy inverso de la capa de aplicación. La capa de aplicación se desarrolla con Go y el siguiente código se utiliza para el proxy inverso:

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

El transporte es el flujo utilizado para la transmisión de datos. Solo necesita obtener los datos de respuesta en el canal de transmisión. Después del tiempo de interrupción, cierre la respuesta para interrumpir la transmisión del flujo.
Al observar el código de transporte en el lenguaje Go, no proporciona una interfaz para obtener la respuesta, por lo que es necesario volver a empaquetar la interfaz de transporte para obtener los datos de respuesta.

// 可关闭 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()
         }
      }
   })
}

El código anterior usa el modo de combinación para combinar http.Transport y http.Response en una estructura e implementa el método RoundTrip (). El método RoundTrip () es un método que el agente necesita implementar, a partir del cual se puede obtener la respuesta correspondiente.

Inicie una operación de temporización en el método ShutDown (). Después de d tiempo, llame al método response.Body.Close () para interrumpir a la fuerza la transmisión de flujo, que realiza esta función. Para obtener más soluciones relacionadas con el video, puede visitar TSINGSEE Qingxi Video para comprenderlo y no dude en consultarnos.

DSS2.png

Supongo que te gusta

Origin blog.csdn.net/EasyDSS/article/details/108648494
Recomendado
Clasificación