Como apresentar um fluxo de vídeo HTTP a qualquer quantidade de clientes através de um servidor Web de Primavera

Desde que tenha uma transmissão de vídeo HTTP num servidor que esteja na mesma rede que o meu servidor Web de primavera, por exemplo em algum url como:

Http://localhost:9090/httpstream

Como posso substituir esta transmissão de Vídeo por uma quantidade de clientes, usando a Primavera? O exemplo seguinte demonstra o fluxo desejado:

  1. o servidor web de primavera pode ser encontrado em http://localhost:9091/spring
  2. Um cliente quer ... acede a uma transmissão de vídeo, então ele liga o seu leitor de vídeo a http://localhost:9091/spring (o servidor web de primavera)
  3. o servidor Web da primavera deve redireccionar o fluxo encontrado em http://localhost:9090/httpstream para o cliente, sem que este saiba que acedeu ao servidor do httpstream. A ligação é feita na primavera, não pelo cliente.
Isto é necessário porque o HTTPStream é um hospedeiro não protegido e não autenticado, e eu queria embrulhá-lo. em torno de um Spring Webserver, para que eu pudesse usar alguma forma de segurança, como um Basic Auth.


tentei pedir alguma forma de mapeamento, mas não consegui encontrar que tipo de objecto regressar, nem como fazer a ligação, mas o comportamento esperado deve ser algo como isto:

@Controller
public class HttpStreamProxyController {

    @RequestMapping("/spring") {
    public /*Stream Object?*/ getSecuredHttpStream() {
       if (clientIsSecured) {
       //... Security information

       return   //What should be returned?
       }
   }
}
Author: Kerooker, 2017-11-14

2 answers

Não sei que tipo de fonte você está usando para gerar o seu fluxo de vídeo (câmera ao vivo ou um arquivo de vídeo ou vídeo do youtube ou ..)

Pode provavelmente utilizar StreamingResponseBody (necessita da Primavera 4.2+). Consultar as seguintes ligações

Http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/streaming-response-body/

Http://shazsterblog.blogspot.in/2016/02/asynchronous-streaming-request.html

Tenta isto. -
    @GetMapping("/stream1")
        @ResponseBody
        public StreamingResponseBody getVidoeStream1(@RequestParam String any) throws IOException {
            /* do security check before connecting to stream hosting server */ 
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<Resource> responseEntity = restTemplate.exchange( "http://localhost:8080/stream", HttpMethod.GET, null, Resource.class );
            InputStream st = responseEntity.getBody().getInputStream();
            return (os) -> {
                readAndWrite(st, os);
            };


    }

private void readAndWrite(final InputStream is, OutputStream os)
            throws IOException {
        byte[] data = new byte[2048];
        int read = 0;
        while ((read = is.read(data)) > 0) {
            os.write(data, 0, read);
        }
        os.flush();
    }
Deve funcionar. Você pode escrever sua própria implementação de readAndWrite () dependendo de seus requisitos. Então, o teu controlador de primavera pode ser algo assim...
@Controller
public class HttpStreamProxyController {

    @RequestMapping("/spring") 
    @ResponseBody
    public StreamingResponseBody  getSecuredHttpStream() {
       if (clientIsSecured) {
       //... Security information

    RestTemplate restTemplate = new RestTemplate();
    // get video stream by connecting to stream hosting server  like this
            ResponseEntity<Resource> responseEntity = restTemplate.exchange( "https://ur-to-stream", HttpMethod.GET, null, Resource.class );
            InputStream st = responseEntity.getBody().getInputStream();
    // Or if there is any other preferred way of getting the video stream use that. The idea is to get the video input stream    

    // now return a StreamingResponseBody  object created by following lambda 
            return (os) -> {
                readAndWrite(st, os);
            };

       } else {
          return null;
       }

   }
}

O StreamingResponseBody devolvido pelo seu ponto final de descanso funcionará bem com HTML5, o que pode ser algo parecido ..

<video width="320" height="240" controls>
  <source src="/spring" type="video/mp4">
  Your browser does not support the video tag
</video>
 1
Author: vsoni, 2017-11-21 06:25:50

Você pode dar uma tentativa ao servidor de mídia kurento. http://doc-kurento.readthedocs.io/en/latest/tutorials/java/tutorial-one2many.html . funciona com {[[0]} e funciona bem para o meu projecto actual.

Como dizem:

Você pode usar qualquer tecnologia Java server side que preferir construir aplicações web com Kurento. Por exemplo, um Java EE puro application, SIP Servlets, Play, Vertex, etc. Escolhemos o Spring Boot para conveniência.

 0
Author: Nonika, 2017-11-21 11:27:27