Construindo uma Pipeline de Video Encoding
Como foi arquitetado do zero um sistema completo de processamento de vídeos com encoding adaptativo, notificações em tempo real, uso de filas e deploy eficiente na nuvem.
Carregando
Como foi arquitetado do zero um sistema completo de processamento de vídeos com encoding adaptativo, notificações em tempo real, uso de filas e deploy eficiente na nuvem.
Conheça a peça que impede caos total em APIs e microserviços distribuídos: Circuit Breaker, o disjuntor inteligente...
Domine a base do DDD com exemplos claros, linguagem direta e dicas que servem para desenvolvedores juniores e sêniors.
Construindo uma Pipeline de Video Encoding. Como foi arquitetado do zero um sistema completo de processamento de vídeos com encoding adaptativo, notificações em tempo real, uso de filas e deploy eficiente na nuvem.
Se você já subiu um vídeo no YouTube e viu ele "processando", está testemunhando a complexidade do encoding adaptativo — uma etapa fundamental que transforma vídeos em múltiplas qualidades (240p, 480p, 720p, 1080p) para entregar a melhor versão possível ao usuário dependendo da conexão.
O projeto começou com decisões críticas, como optar por Vite em vez de Next para o dashboard de controle, e adotar a biblioteca Effect em TypeScript, que traz um modelo funcional avançado para manipulação de efeitos, tratamento de erros e dependências.
A pipeline inicia com mensagens enviadas ao SQS da AWS contendo a URL do vídeo. Um worker em Node consome a fila, inicia o encoding para quatro resoluções e, ao finalizar cada uma, usa SNS para publicar eventos de progresso e ativa o upload automático para o Cloudflare R2.
Ao final do processo, uma playlist HLS (Master Playlist) é gerada, vinculando todos os segmentos criados. Isso permite que players modernos ajustem dinamicamente a resolução do vídeo conforme a largura de banda do usuário.
Encoding é extremamente pesado em CPU e disco. Garantir concorrência entre operações de upload e conversão maximiza aproveitamento de recursos sem desperdiçar ciclos ociosos.
Para otimizar tempo, o script processa duas resoluções simultaneamente. Enquanto o 240p é convertido e enviado para o R2, o 480p é processado em paralelo, e assim por diante. Dessa forma, o CPU e o upload são aproveitados ao máximo.
Todo o processo implementa tracing granular que alimenta uma ferramenta como o Jaeger. Com isso é possível visualizar cada etapa do processo, incluindo tempos precisos de encoding, geração de thumbnails e upload para storage.
O SNS da AWS é integrado para enviar notificações de progresso ao sistema principal. O usuário final consegue acompanhar os 20%, 40%, 60% do encoding até o processo atingir 100% com a playlist e thumbnails gerados.
Usar SNS ou Websockets de forma acertada evita over-fetching no front-end, mantendo a UX real-time fluida e sem polling desnecessário.
O script em Node lê mensagens do SQS, executa o ProcessEncode usando Effect TS, que lida elegantemente com efeitos e erros. O processamento internamente utiliza um banco de dados em memória (Map) apenas para simulação neste estágio local.
Effect traz segurança de execução e garante lidarmos com todos os erros que possam surgir. Se uma fila falta, o processador quebra imediatamente e você é alertado em tempo de desenvolvimento.
Sem tratar todos os erros possíveis, sua pipeline poderá travar silenciosamente, desperdiçando ciclos e aumentando tempo de processamento.
Ao final do encoding, quatro miniaturas são geradas do arquivo final. Essas thumbnails são enviadas ao Cloudflare R2 para uso imediato no frontend do SaaS, exibindo sugestões visuais mesmo antes da conversão total.
A playlist é o arquivo central que conecta todos os segmentos para cada resolução. É ela que players como o do YouTube ou JWPlayer usam para realizar streaming adaptativo.
Com a Master Playlist corretamente estruturada, qualquer player compatível conseguirá trocar de qualidade sem interferência do usuário final.
O encoding roda em instâncias sob demanda específicas, não requer servidores contínuos. Usando filas desacopladas e serviços como R2 e SNS, esse sistema suporta dezenas de vídeos com baixo custo e excelente performance.
O objetivo foi evitar dependência de software de terceiros caros e ganhar controle total. Com uma arquitetura baseada nas primitives da AWS, é possível balancear escalabilidade, resiliência e baixo custo.
O script pode ser testado manualmente com o comando npm run manual. Ele simula um job completo de encoding com vídeo pré-definido, essencial para inspeção de logs e ajustes no processo.
No momento, o projeto ainda é privado, mas pode ser aberto no futuro baseado no interesse da comunidade. Deixe um comentário indicando se isso seria útil no seu stack.