Как прокси-поток HTTP-видео для любого количества клиентов через веб-сервер Spring
при условии, что у меня есть видеопоток HTTP, транслируемый на сервере, который находится в той же сети, что и мой веб-сервер Spring, например, в некоторых url, таких как:
как я могу проксировать этот видеопоток любому количеству клиентов, используя Spring? Следующий пример демонстрирует требуемый поток:
- Весна-сервер можно найти на http://localhost:9091/spring
- клиент хочет получить доступ к видеопотоку, поэтому он подключает свой видеопоток к http://localhost:9091/spring (весенний веб-сервер)
- весенний веб-сервер должен перенаправить поток, найденный на 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 для удобство.