Como aceleramos a codificação de vídeo em oito vezes

Como aceleramos a codificação de vídeo em oito vezes

Todos os dias, milhões de espectadores assistem a vídeos na Internet. Mas para que o vídeo fique disponível, ele não deve apenas ser carregado no servidor, mas também processado. Quanto mais rápido isso acontecer, melhor para o serviço e seus usuários.

Meu nome é Askar Kamalov, há um ano entrei para a equipe de tecnologia de vídeo da Yandex. Hoje contarei brevemente aos leitores do Habr como, ao paralelizar o processo de codificação, conseguimos acelerar significativamente a entrega do vídeo ao usuário.

Esta postagem será de interesse principalmente para aqueles que ainda não pensaram sobre o que acontece nos bastidores dos serviços de vídeo. Nos comentários você pode tirar dúvidas e sugerir temas para postagens futuras.

Algumas palavras sobre a tarefa em si. Yandex não apenas ajuda você a pesquisar vídeos em outros sites, mas também armazena vídeos para seus próprios serviços. Seja um programa original ou uma partida esportiva no ar, um filme no KinoPoisk ou vídeos no Zen e News - tudo isso é carregado em nossos servidores. Para que o usuário possa assistir ao vídeo, ele precisa ser preparado: convertido para o formato desejado, criado uma prévia ou até mesmo executado por meio de tecnologia Deep HD. Um arquivo não preparado apenas ocupa espaço. Além disso, não estamos falando apenas do uso ideal do hardware, mas também da velocidade de entrega do conteúdo aos usuários. Exemplo: uma gravação do momento decisivo de uma partida de hóquei pode ser pesquisada um minuto após o evento em si.

Codificação sequencial

Portanto, a felicidade do usuário depende muito da rapidez com que o vídeo fica disponível. E isso é determinado principalmente pela velocidade de transcodificação. Quando não há requisitos rígidos para a velocidade de upload do vídeo, não há problemas. Você pega um arquivo único e indivisível, converte-o e carrega-o. No início da nossa jornada, foi assim que trabalhamos:

Como aceleramos a codificação de vídeo em oito vezes

O cliente carrega o vídeo para o armazenamento, o componente Analisador coleta metainformações e transfere o vídeo para o componente Worker para conversão. Todas as etapas são realizadas sequencialmente. Neste caso, pode haver muitos servidores de codificação, mas apenas um está ocupado processando um vídeo específico. Diagrama simples e transparente. É aqui que terminam suas vantagens. Este esquema só pode ser dimensionado verticalmente (devido à compra de servidores mais potentes).

Codificação sequencial com resultado intermediário

Para amenizar de alguma forma a dolorosa espera, a indústria criou uma opção de codificação rápida. O nome é enganoso porque, na verdade, a codificação completa ocorre sequencialmente e leva o mesmo tempo. Mas com um resultado intermediário. A ideia é esta: preparar e publicar uma versão do vídeo em baixa resolução o mais rápido possível, e só então versões em maior resolução.

Por um lado, o vídeo fica disponível mais rapidamente. E é útil para eventos importantes. Mas, por outro lado, a imagem fica embaçada e isso incomoda os espectadores.

Acontece que você precisa não apenas processar o vídeo rapidamente, mas também manter sua qualidade. Isso é o que os usuários esperam de um serviço de vídeo agora. Pode parecer que basta comprar os servidores mais produtivos (e atualizá-los regularmente, todos de uma vez). Mas isso é um beco sem saída, porque sempre há um vídeo que fará com que até o hardware mais poderoso fique lento.

Codificação paralela

É muito mais eficiente dividir um problema complexo em muitos problemas menos complexos e resolvê-los em paralelo em servidores diferentes. Este é o MapReduce para vídeo. Neste caso, não estamos limitados pelo desempenho de um servidor e podemos escalar horizontalmente (adicionando novas máquinas).

Aliás, a ideia de dividir os vídeos em pequenos pedaços, processá-los em paralelo e colá-los não é segredo algum. Você pode encontrar muitas referências a esta abordagem (por exemplo, no Habré recomendo um post sobre o projeto DistVIDc). Mas isso não torna tudo mais fácil, porque você não pode simplesmente pegar uma solução pronta e incorporá-la em sua casa. Precisamos de adaptação à nossa infraestrutura, ao nosso vídeo e até à nossa carga. Em geral, é mais fácil escrever o seu próprio.

Assim, na nova arquitetura, dividimos o bloco Worker monolítico com codificação sequencial em microsserviços Segmenter, Tcoder, Combiner.

Como aceleramos a codificação de vídeo em oito vezes

  1. O segmentador divide o vídeo em fragmentos de aproximadamente 10 segundos. Os fragmentos consistem em um ou mais GOPs (grupo de fotos). Cada GOP é independente e codificado separadamente para que possa ser decodificado sem referência a quadros de outros GOPs. Ou seja, os fragmentos podem ser reproduzidos independentemente uns dos outros. Essa fragmentação reduz a latência, permitindo que o processamento comece mais cedo.
  2. O Tcoder processa cada fragmento. Ele pega uma tarefa da fila, baixa um fragmento do armazenamento, codifica-o em diferentes resoluções (lembre-se que o jogador pode escolher uma versão com base na velocidade da conexão), depois coloca o resultado de volta no armazenamento e marca o fragmento como processado no banco de dados. Tendo processado todos os fragmentos, o Tcoder envia a tarefa para gerar resultados para o próximo componente.
  3. O Combiner coleta os resultados juntos: baixa todos os fragmentos feitos pelo Tcoder, gera streams para diferentes resoluções.

Algumas palavras sobre som. O codec de áudio AAC mais popular possui um recurso desagradável. Se você codificar fragmentos separadamente, simplesmente não conseguirá colá-los perfeitamente. As transições serão perceptíveis. Os codecs de vídeo não apresentam esse problema. Teoricamente, você pode procurar uma solução técnica complexa, mas este jogo simplesmente não vale a pena ainda (o áudio pesa significativamente menos que o vídeo). Portanto, apenas o vídeo é codificado em paralelo e toda a trilha de áudio é processada.

Descobertas

Graças ao processamento paralelo de vídeo, reduzimos significativamente o atraso entre o envio de um vídeo para nós e a disponibilização aos usuários. Por exemplo, anteriormente poderia levar duas horas para criar várias versões completas de qualidade diferente para um filme FullHD com duração de uma hora e meia. Agora tudo isso leva 15 minutos. Além disso, com o processamento paralelo, criamos uma versão de alta resolução ainda mais rápida do que uma versão de baixa resolução com a antiga abordagem de resultados intermediários.

E mais uma coisa. Com a abordagem antiga, ou não havia servidores suficientes ou eles ficavam ociosos sem tarefas. A codificação paralela permite aumentar a participação na reciclagem do ferro. Agora nosso cluster de mais de mil servidores está sempre ocupado com alguma coisa.

Na verdade, ainda há espaço para melhorias. Por exemplo, podemos economizar um tempo significativo se começarmos a processar fragmentos do vídeo antes que ele chegue até nós na íntegra. Como se costuma dizer, mais por vir.

Escreva nos comentários sobre quais tarefas na área de trabalho com vídeo você gostaria de ler.

Links úteis para a experiência de colegas da indústria

Fonte: habr.com

Adicionar um comentário