Como aceleramos a codificação de vídeo 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 deve não apenas ser carregado no servidor, mas também processado. Quanto mais rápido isso acontecer, melhor o serviço e seus usuários.

Meu nome é Askar Kamalov. Há um ano, entrei para a equipe de tecnologia de vídeo Yandex. Hoje vou contar brevemente aos leitores de Habr como, usando a paralelização do processo de codificação, conseguimos acelerar a entrega do vídeo ao usuário várias vezes.

Este post será de interesse principalmente para quem ainda não pensou no que está acontecendo sob o capô dos serviços de vídeo. Nos comentários, você pode fazer perguntas e sugerir tópicos para postagens futuras.

Algumas palavras sobre a tarefa em si. O Yandex não apenas ajuda a procurar vídeos em outros sites, mas também armazena vídeos para seus próprios serviços. Seja um programa de um autor ou uma partida de esportes no Ether, um filme no KinoPoisk ou vídeos no Zen e News - tudo isso é enviado para nossos servidores. Para que os usuários assistam a um vídeo, ele precisa estar preparado: convertê-lo para o formato necessário, criar uma visualização ou até mesmo conduzi-lo através da tecnologia DeepHD . Um arquivo não preparado ocupa apenas espaço. E estamos falando não apenas sobre o uso ideal do ferro, mas também sobre a velocidade da entrega de conteúdo aos usuários. Exemplo: um registro com o momento decisivo de uma partida de hóquei pode ser pesquisado na busca dentro de um minuto após o próprio evento.

Codificação sequencial


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



o cliente carrega o vídeo no repositório, o componente Analyzer coleta informações meta e transfere o vídeo para conversão no componente Worker. Todas as etapas são executadas seqüencialmente. Ao mesmo tempo, pode haver muitos servidores para codificação, mas apenas um está ocupado processando um vídeo específico. Layout simples e transparente. É aqui que seus méritos terminam. Esse esquema é dimensionado apenas verticalmente (devido à compra de servidores mais poderosos).

Codificação seqüencial com resultado intermediário


Para, de alguma forma, atenuar a dolorosa expectativa, a indústria criou uma opção rápida de codificação. Esse é um nome enganoso, porque, de fato, a codificação completa ocorre sequencialmente e por tanto tempo. Mas com um resultado intermediário. A idéia é a seguinte: prepare e faça o upload da versão em baixa resolução do vídeo o mais rápido possível e somente mais tarde - versões em alta resolução.

Por um lado, o vídeo está se tornando mais rápido. E é útil para eventos importantes. Mas por outro lado - a imagem é embaçada, e isso irrita a platéia.

Acontece que você precisa não apenas processar rapidamente o vídeo, mas também preservar sua qualidade. Agora é o que os usuários esperam de um serviço de vídeo. Pode parecer que basta comprar os servidores mais produtivos (e atualizá-los regularmente de uma só vez). Mas esse é um caminho para um beco sem saída, porque sempre há um vídeo que desacelera até o hardware mais poderoso.

Codificação paralela


É muito mais eficiente dividir uma tarefa difícil em muitas menos complexas e resolvê-las simultaneamente em diferentes servidores. É o MapReduce para vídeo. Nesse caso, não nos baseamos no desempenho de um único servidor e podemos escalar horizontalmente (adicionando novas máquinas).

A propósito, a idéia de dividir um vídeo em pedaços pequenos, processando-os e colando-os simultaneamente, não é um segredo. Você pode encontrar muitas referências a essa abordagem (por exemplo, em Habré, recomendo um post sobre o projeto DistVIDc ). Mas isso geralmente não facilita, porque você não pode simplesmente pegar uma solução pronta e incorporá-la em si mesmo. Precisamos nos adaptar à nossa infraestrutura, nosso vídeo e até nossa carga de trabalho. 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.



  1. O segmentador divide o vídeo em fragmentos em cerca de 10 segundos. Os fragmentos consistem em um ou mais GOP ( 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 um do outro. Essa segmentação reduz a latência, permitindo iniciar o processamento mais cedo.
  2. Tcoder . , , (, , ), . , Tcoder .
  3. ombiner : , Tcoder, .

Algumas palavras sobre o som. O codec de áudio AAC mais popular tem um recurso desagradável. Se você codificar os fragmentos separadamente, colá-los sem problemas simplesmente não funcionará. As transições serão visíveis. Codecs de vídeo não têm esse problema. Teoricamente, você pode procurar uma solução técnica difícil, mas esse jogo simplesmente não vale a pena (o áudio pesa significativamente menos que o vídeo). Portanto, apenas o vídeo é codificado em paralelo conosco e a faixa de áudio é processada como um todo.

resultados


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

E algo mais. Com a abordagem antiga, os servidores podem estar ausentes ou estavam ociosos sem tarefas. A codificação paralela pode aumentar a participação na utilização do ferro. Agora, nosso cluster de mais de mil servidores está sempre ocupado com algo.

De fato, ainda há espaço para melhorias. Por exemplo, podemos economizar muito tempo se começarmos a processar fragmentos de um vídeo antes mesmo que ele chegue na íntegra. Como se costuma dizer, mais - mais.

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

Links úteis para colegas do setor



All Articles