Desenvolvi uma plataforma de streaming sincronizado para criar uma sala de cinema virtual com múltiplos espectadores em sincronia perfeita e qualidade otimizada. O sistema automatiza todo o pipeline de processamento de mídia e garante sincronização em tempo real.
Objetivo
Implementar um sistema onde um host controla play/pause/seek e troca de legendas, garantindo que todos os espectadores vejam o mesmo frame independente da latência individual.
Arquitetura geral
flowchart LR subgraph Backend API[Node/Express] -->|Dispara| Worker Worker[Worker Python] -->|Orquestra| Pipeline end subgraph Pipeline Pipeline --> WebTorrent[(WebTorrent)] Pipeline --> FFmpeg[(FFmpeg/ffprobe)] Pipeline --> Legendagem[(ffsubsync + subliminal)] Pipeline --> TMDB[(TMDB API)] end API -->|Socket.IO| Frontend[Cliente Web] Frontend -->|Hls.js| Mídia[(HLS)]
Stack técnica
1. Sincronização em tempo real
Socket.IO estabelece comunicação bidirecional entre servidor e clientes, propagando eventos de controle (play, pause, seek) instantaneamente.
Sistema de correção de drift baseado em heartbeat pings periódicos para recalibrar o tempo de reprodução.
Hls.js gerencia o player no cliente, permitindo sincronização precisa com os comandos recebidos via WebSocket.
2. Orquestração backend
Node/Express expõe API REST para gerenciamento de sessões e integra com Socket.IO para comunicação em tempo real.
Worker Python executa o pipeline de processamento usando tmdbv3api, subliminal, ffsubsync e Pillow.
3. Pipeline de mídia
Download com WebTorrent em modo headless.
Normalização via ffprobe para detecção de codecs e containers.
Processamento de legendas: busca automática EN/PT-BR com subliminal, sincronização com ffsubsync e conversão para WebVTT.
Transcodificação HLS: FFmpeg gera streaming adaptativo com múltiplos bitrates organizados em playlists m3u8.
Organização: metadados e artes salvos em estrutura canônica com cache JSON.
4. Protocolo de sincronização
Socket.IO mantém conexão persistente entre servidor e todos os clientes.
Host emite eventos de controle que são propagados instantaneamente via WebSocket.
Sistema de compensação de latência ajusta o tempo de reprodução baseado em pings periódicos.
Hls.js permite seeking preciso para manter todos os espectadores no mesmo frame.
5. Interface
Player implementado com Hls.js, com fallback para navegadores com suporte nativo a HLS.
Interface desenvolvida em TailwindCSS exibindo status de conexão e latência.
Transmissão em tempo real do progresso do pipeline de processamento.
Desafios técnicos
Sincronização precisa: gerenciamento de drift requer compensação de clock do cliente, latência de rede e buffering do player. Implementado sistema de heartbeat pings para recalibração contínua.
Legendas automatizadas: sincronização de legendas baixadas com o áudio do vídeo usando ffsubsync, eliminando necessidade de ajuste manual.
Otimização de recursos: configuração de limites no WebTorrent e processamento sequencial no FFmpeg para gestão eficiente de I/O.
Streaming adaptativo: geração de múltiplos bitrates HLS para garantir qualidade otimizada conforme a capacidade de cada cliente.
Resultado
A plataforma processa novos conteúdos em minutos, mantém biblioteca organizada e garante streaming estável independente da qualidade de conexão dos espectadores. O sistema demonstra viabilidade técnica de sincronização em tempo real para experiências de visualização coletiva.