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-ws

, то сервер никак не отреагирует, а 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();
        }
    }
}

На выходе получаю байты, наполненные нулями. До конца не понимаю, что с ними делать дальше.

Debug

Каким способом можно получать данные, подключаясь из OBS к серверу на Spring Boot, чтобы успешно их обрабатывать в дальнейшем? Какие доп. библиотеки точно придется использовать, при работе с HLS протоколом (например, нужен ли ffmpeg, который во многих статьях рекомендуют)? Будут ли тут уместны микросервисы?

Если кто-то имеет подобный опыт или исследования, поделитесь. Буду благодарен.


Ответы (0 шт):