Как прокси-поток HTTP-видео для любого количества клиентов через веб-сервер Spring

при условии, что у меня есть видеопоток HTTP, транслируемый на сервере, который находится в той же сети, что и мой веб-сервер Spring, например, в некоторых url, таких как:

http://localhost:9090/httpstream

как я могу проксировать этот видеопоток любому количеству клиентов, используя Spring? Следующий пример демонстрирует требуемый поток:

  1. Весна-сервер можно найти на http://localhost:9091/spring
  2. клиент хочет получить доступ к видеопотоку, поэтому он подключает свой видеопоток к http://localhost:9091/spring (весенний веб-сервер)
  3. весенний веб-сервер должен перенаправить поток, найденный на http://localhost:9090/httpstream клиенту, причем последний никогда не знал, что он получил доступ к хосту httpstream. Соединение сделано весной, не клиент

Это необходимо, потому что HTTPStream является незащищенным и не аутентифицированным хостом, и я хотел обернуть его вокруг Spring Webserver, чтобы я мог использовать некоторую форму безопасности, такую как Basic Auth.


Я попытался запросить некоторую форму отображения, но я не мог найти, какой объект вернуть, ни как установить связь, но ожидаемое поведение должно быть примерно таким:

@Controller
public class HttpStreamProxyController {

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

       return   //What should be returned?
       }
   }
}

2 ответов


Я не уверен, какой источник вы используете для создания видеопотока (живая камера или видеофайл или видео youtube или ..)

вероятно, вы можете использовать StreamingResponseBody (требуется Весна 4.2+). Смотрите ниже ссылки

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

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

попробуйте это -

    @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();
    }

это должно сработать. Вы можете написать свою собственную реализацию readAndWrite () в зависимости от ваших требований.

Итак, ваш spring proxy controller может быть чем-то вроде этот...

@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;
       }

   }
}

StreamingResponseBody, возвращенный вашей конечной точкой rest, будет отлично работать с HTML5, что может быть что-то вроде ..

<video width="320" height="240" controls>
  <source src="/spring" type="video/mp4">
  Your browser does not support the video tag
</video>

вы можете попробовать kurento media server. http://doc-kurento.readthedocs.io/en/latest/tutorials/java/tutorial-one2many.html. Он работает с WEB-RTC и хорошо работает для моего текущего проекта.

говорится:

вы можете использовать любую технологию Java server side, которую вы предпочитаете создавать веб-приложения с Kurento. Например, чистая Java EE применение, сервлеты глоточка, игра, вершина, etc. Мы выбрали Spring Boot для удобство.