Torbware Theater (Streaming com watch party HLS)

qua., 15 de janeiro de 2025 - 3 min read

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

  1. Download com WebTorrent em modo headless.
  2. Normalização via ffprobe para detecção de codecs e containers.
  3. Processamento de legendas: busca automática EN/PT-BR com subliminal, sincronização com ffsubsync e conversão para WebVTT.
  4. Transcodificação HLS: FFmpeg gera streaming adaptativo com múltiplos bitrates organizados em playlists m3u8.
  5. 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.