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:
Como posso substituir esta transmissão de Vídeo por uma quantidade de clientes, usando a Primavera? O exemplo seguinte demonstra o fluxo desejado:
- o servidor web de primavera pode ser encontrado em http://localhost:9091/spring 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)
- 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.
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?
}
}
}
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>
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.