HeadlinesBriefing HeadlinesBriefing.com

Motor de reuniões do Electron em Swift

Hacker News •
×

Nosso app de desktop captura reuniões sem um bot e as transmite para a nuvem. Por meses, o motor de gravação foi a parte mais difícil do produto de tornar confiável. Corrigíamos uma classe de caso extremo, lançávamos, e na semana seguinte surgia um novo. Causas raiz diferentes, o mesmo padrão. O motor rodava no processo de renderização do nosso app Electron. Tentamos as correções óbvias: gerenciamento de ciclo de vida mais rigoroso, mover o trabalho para fora da thread principal e isolá-lo do ciclo de renderização do React. Cada mudança ajudou marginalmente, mas nenhuma abordou o problema real. Um processo de renderização é o lugar errado para fazer captura de áudio e vídeo em tempo real. Um motor de captura não pode tolerar pausas de GC, throttling nem nenhuma das outras coisas que um runtime de navegador faz para continuar responsivo.

Então fomos para o nativo: Screen Capture Kit no macOS, libobs no Windows e uma camada Swift compartilhada unindo tudo. Fazer a ponte entre um runtime nativo e o React geralmente significa escrever bindings de addons nativos à mão. E se cada propriedade @Published em Swift se tornasse automaticamente um átomo Jotai no React? É exatamente isso que nossa ferramenta interna Atomic faz.

No macOS, recebemos buffers de amostra brutos de três fontes independentes e montamos o arquivo nós mesmos. No Windows, captura, mixagem, codificação e muxing rodam como um único grafo. Usamos o Windows Graphics Capture (WGC) como método principal e, se ele não entregar quadros a tempo, recuamos para o Bit Blt. Também detectamos quadros totalmente pretos e trocamos de método no meio da gravação.

Uma falha no minuto 30 perde no máximo o último segundo. Os segmentos vão simultaneamente para o armazenamento local e para a nuvem. Se a rede cair, os segmentos persistem localmente e o upload é retomado automaticamente quando a conectividade volta. A gravação de desktop costumava ser uma das nossas fontes mais comuns de tickets de suporte. Agora é uma parte chata do app que simplesmente funciona.

Fonte: Hacker News · Resumido por HeadlinesBriefing