Spring Boot в качестве серверной стороны для трансляции с OBS
Основная цель: создать сервер на Java (Spring Boot), к которому бы мог подключиться OBS для проведения трансляции, после чего серверная часть выполнила те или иные обработки (при необходимости) и отдала их на клиентскую сторону для воспроизведения трансляции. Работать планирую с протоколом HLS.
По моим наблюдениям (и небольшому опыту), для таких случаев можно использовать WebSocket'ы. Создав проект "песочницу", стал изучать сокеты.
Класс WebsocketConfigure
@Configuration
@EnableWebSocket
public class WebsocketConfigure implements WebSocketConfigurer {
private final VideoWebSocketHandler videoWebSocketHandler;
public WebsocketConfigure(VideoWebSocketHandler videoWebSocketHandler) {
this.videoWebSocketHandler = videoWebSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(videoWebSocketHandler, "/video/socket");
}
}
Класс VideoWebSocketHandler
@Component
public class VideoWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) {
System.out.println("established connection:" + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
System.out.println("close session");
}
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
byte[] buffer = new byte[message.getPayloadLength()];
message.getPayload().get(buffer);
}
}
Если в настройках OBS указать ws://localhost:8080/video/socket

, то сервер никак не отреагирует, а OBS начнет "виснуть". Однако, если указать rtmp://localhost:8080/video/socket, то на сервере появится вот такое сообщение:
INFO 945 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
java.lang.IllegalArgumentException: Invalid character found in method name [0x03i0x8f0xd90xda0x000x000x000x00%'_g(#0x030x18h#0xf9uZ0xbd0x837/|0x04*60x07u0x0c0x9dp,W!0x800x95&Q0x0a0x0f!0xcb\nb0xe9E0x8e;0x8a0xe20x8fy_0x10bU0xc40xf8]. HTTP method names must be tokens
Для меня это небольшой успех, который означает, что взаимодействие между приложениями как-то пытается происходить.
После решил попробовать использовать обычный ServerSocket (Java SE).
public class SandboxApplication {
private static Socket clientSocket;
private static ServerSocket server;
private static DataInputStream dataInputStream;
private static DataOutputStream dataOutputStream;
private static BufferedInputStream bufferedInputStream;
private static BufferedOutputStream bufferedOutputStream;
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(4004);
System.out.println("Сервер запущен!");
Socket clientSocket = server.accept();
try {
dataInputStream = new DataInputStream(clientSocket.getInputStream());
dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream());
bufferedOutputStream = new BufferedOutputStream(clientSocket.getOutputStream());
} finally {
IOUtils.close(dataInputStream);
IOUtils.close(bufferedInputStream);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
На выходе получаю байты, наполненные нулями. До конца не понимаю, что с ними делать дальше.
Каким способом можно получать данные, подключаясь из OBS к серверу на Spring Boot, чтобы успешно их обрабатывать в дальнейшем? Какие доп. библиотеки точно придется использовать, при работе с HLS протоколом (например, нужен ли ffmpeg, который во многих статьях рекомендуют)? Будут ли тут уместны микросервисы?
Если кто-то имеет подобный опыт или исследования, поделитесь. Буду благодарен.
