Na foto - a primeira bicicleta voadora de quatro rodas. FonteHoje, devido à disponibilidade dos serviços necessários, publicar vídeos na rede não é uma tarefa difícil. No entanto, não existem muitos materiais na estrutura interna de tais sistemas, especialmente no segmento de idioma russo.
Estou envolvido no design e desenvolvimento de uma plataforma de vídeo de alta qualidade há algum tempo. Neste artigo, quero descrever aqueles momentos que eu mesmo gostaria de conhecer no início do desenvolvimento.
O artigo não reivindica status de liderança; tentarei descrever apenas pontos interessantes ou não óbvios que afetam o processamento e a entrega de conteúdo de vídeo baseado em HTML5.
O material foi projetado para aqueles que já estão no assunto ou estão prontos para procurar uma repartição de abreviações, termos e conceitos.
A segunda parte.Formatar
H264 De alto perfil, apesar de sua popularidade, verifica-se que ele não funciona em todos os lugares - alguns navegadores não incluem seu suporte. Felizmente, em dispositivos modernos, em quase todos os lugares onde o H264 não é suportado, o VP8 / 9 funciona. É preferível usar o VP9, pois Eu não vi versões mais antigas de decodificadores que podem VP8, mas não VP9 ou H264. O VP9 oferece uma qualidade de imagem comparável à H264 com uma taxa de bits de ~ 30% menor - isso é importante para reduzir a carga nos canais. Além disso, se o uso do codec MPEG pode potencialmente ter reivindicações legais (uma história muito complicada), o VP9 está indo bem com isso. É verdade que a velocidade de codificação do VP9 é aproximadamente uma ordem de magnitude mais baixa, portanto, mais recursos devem ser alocados para seu processamento.
Se houver necessidade de oferecer suporte a equipamentos antigos que não suportam o H264 High, você poderá adicionar o 480p H264 Main com uma taxa de bits mais baixa como terceiro formato.
O Hi10P é extremamente melhor não usar por causa do suporte insuficiente à decodificação de hardware.
Obviamente, o H265 exigirá taxas de licenciamento, o que não é para todos.
Soft vs hard
Os codificadores de hardware não usam a maioria dos recursos avançados dos codecs (economizando espaço em chips), fornecendo arquivos codificados de maneira não ideal. A escolha do formato é limitada, nem todos podem ser configurados com parâmetros de codificação - geralmente, dos valores que realmente afetam o resultado, há apenas uma taxa de bits e até isso é percebido de maneira muito peculiar. Se tudo for feito como deveria, em chips normais, você poderá obter um resultado completamente sensato com uma taxa de bits linear (efeito em cenas dinâmicas) e um pouco mais alto.
E, é claro, para o codificador de hardware funcionar, você precisa de um dispositivo - uma placa de vídeo ou processador com um núcleo de vídeo, que nem todos os servidores possuem.
Mas eles são rápidos. Muito. Comparado ao processamento de software, a velocidade pode aumentar algumas centenas de vezes, para um nível no qual as E / S de disco podem não ser suficientes.
O processamento por métodos de hardware depende muito do fornecedor da solução - cada fornecedor possui seu próprio conjunto de bibliotecas e utilitários para isso, e há muito por onde escolher: Intel Quick Sync, NVenc, AMD VCE.
Com o processamento de software, não existem restrições e, com taxa de bits equivalente, o resultado é melhor. Para trabalhar com vários formatos e codecs, existe o ffmpeg; Os "apparatchiks" não têm esse luxo (com reservas).
Critérios de qualidade do vídeo
Para determinar a qualidade alvo, é mais fácil ler em bits por pixel, BPP. Essa configuração é independente da resolução, taxa de quadros e duração. Já considere a taxa de bits de acordo com a fórmula
BPP * Framerate * Width * Height
Os melhores valores de BPP são escolhidos por experimentos independentes para o vídeo que você planeja processar. Um bom valor inicial para o H264 é de cerca de 0,09 bps. Para codecs de alto desempenho, como H265 e VP9, esse parâmetro pode ser reduzido proporcionalmente à taxa de compactação comparativa. Além disso, o BPP pode ser ligeiramente reduzido para vídeo de alta resolução, como a eficiência dos codecs cresce um pouco com a resolução, mas, para essa correção, é necessário levar em consideração a resolução da seção de codificação (fatias, um recurso de codecs que permite codificar vídeo com blocos semi-independentes de resolução fracionária).
Para a taxa de bits obtida pela fórmula acima, é aconselhável predeterminar os valores máximos com base na velocidade esperada da Internet do cliente - poucas pessoas ficarão confortáveis assistindo a um vídeo de alta qualidade, mas constantemente armazenado em buffer.
É por isso que é inconveniente usar parâmetros Q de codecs (papagaios de qualidade) - valores fixos fornecem uma taxa de bits final imprevisível.
maxRate é melhor feito com uma margem, porque codecs podem não manter com precisão os valores necessários, mesmo com a codificação de duas passagens.
Para manter a qualidade das cenas dinâmicas, é melhor habilitar o modo VBR dos codecs; no entanto, é melhor definir minRate para definir pelo menos 90% da taxa de bits total, para que os picos de taxa não levem a falhas de buffer.
Utilitários como Intel VPA, ffprobe e Python são úteis no controle de qualidade. Usando este último, é conveniente fazer comparações entre a fonte e o vídeo convertido, ler métricas arbitrárias, como o desvio médio de pixels.
O cálculo do PSNR e SSIM na prática é extremamente ineficiente devido às otimizações psicovisuais, que são incluídas nos codecs por padrão. Se você deseja calcular essas métricas de maneira mais ou menos adequada, pode desativar as otimizações via
-tune [psnr|ssim]
No entanto, o arquivo final, é claro, será diferente daquele criado sem esses sinalizadores.
Pré-visualização
O principal problema de gerar imagens em miniatura é uma fonte confusa. A definição e a busca de imagens nítidas é uma tarefa não trivial e que consome muitos recursos. Felizmente, a solução para esse problema na maioria dos codecs está incluída no processo de codificação de vídeo. Você pode colocar o quadro-chave o mais próximo possível de uma determinada posição; de todos os quadros ao redor, será o mais claro. No ffmpeg, isso pode ser feito assim:
-ss [] -vf \"select='eq(pict_type,PICT_TYPE_I)'\" -vsync vfr
Os codificadores padrão não são compactados da melhor maneira; portanto, após receber a imagem, é melhor compactá-la com algo como optipng - economizando uma média de 500kB na visualização FHD.
É melhor fazer imagens de alta resolução entrelaçadas. Assim, aumentaremos ligeiramente o tamanho (de 5 a 10%), mas reduziremos seriamente o tempo de exibição na página de carregamento.
O artigo já se mostrou denso e tenho dúvidas de que toda a informação precise ser compactada em um grande texto. Se você estiver interessado em continuar neste tópico, escreva nos comentários ou marque na pesquisa.
A plataforma está fechada, mas você pode ver seu trabalho
aqui .
* Não tenho relação com os autores dos respectivos sites e não posso compartilhar seus pontos de vista e opiniões. Não posso comentar sobre as decisões sobre quem e como o acesso ao código é concedido.Pronto para responder a perguntas.