Streaming de vídeos com AWS MediaConvert

jonasbarros

Jonas Barros

Posted on August 4, 2024

Streaming de vídeos com AWS MediaConvert

Prólogo

Neste artigo, apresentarei como foi o processo de discovery e desenvolvimento do tech challenge que teve o seguinte tema: desenvolvimento de uma aplicação web de streaming de vídeos. Veremos quais ferramentas foram utilizadas, entenderemos como funciona um streaming de vídeo, aprenderemos sobre codecs, bitrate, segmentos, protocolos de vídeo, e, por fim, integraremos todas essas tecnologias utilizando o AWS MediaConvert.

Esse tech challenge é um dos quatro trabalhos que tivemos que desenvolver durante o período da pós-graduação realizada na FIAP.

Ferramentas da AWS utilizadas para desenvolvimento do projeto

  • AWS S3: Para armazenar as mídias originais, e os pequenos pacotes de vídeo gerados após o processamento do MediaConvert.

  • AWS MediaConvert: Este é um serviço específico para processamento de vídeos. Com ele, é possível definir os protocolos de reprodução de vídeos, segmentos, bitrate, resolução, codecs e diversos outros parâmetros utilizados no desenvolvimento deste projeto.

  • AWS SQS: O serviço de mensageria da AWS foi utilizado para fazer a comunicação entre os dois microsserviços. O primeiro microsserviço é chamado de stream de vídeos, enquanto o segundo é chamado de pipeline de processamento de vídeos. Ao longo deste artigo, focaremos no desenvolvimento do microsserviço chamado pipeline de processamento de vídeos.

Arquitetura do projeto

Abaixo estão os dois microsserviços que precisaram ser criados para o desenvolvimento do techchallange. O serviço que iremos aprofundar para melhor entendimento é a pipeline de processamento de vídeos. Dentro deste microsserviço nós temos a integração com o MediaConvert no qual será o foco principal deste artigo.

Desenho arquitetural

O primeiro microsserviço se chama stream de vídeos, será o responsável por enviar a mídia original ao AWS S3 e fazer as outras regras de negócio que eram requisitos obrigatórios do tech challange.

Já o segundo microsserviço se chama pipeline de processamento de vídeos, em meu cenário ele é o responsável por fazer o processamento dos vídeos, por exemplo, separar a mídia bruta em pequenos pacotes para agilizar o tráfego do conteúdo na rede do usuário, definição dos codecs, resolução e bitrate.

O MediaConvert no qual utilizamos, é uma ferramenta extremamente poderosa, com ela nós conseguimos fazer diversas configurações, inclusive fazer pequenas melhorias no vídeo. Se não conhecer o MediaConvert, é importante entender um pouco sobre ele antes de continuar a leitura. Foi com ele que fizemos toda a configuração para processamento de vídeos.

Observe também que entre os dois microsserviços existe o AWS SQS, como disse anteriormente ele é responsável por fazer a comunicação entre os serviços. No payload do SQS enviaremos o nome da mídia para que a pipeline de processamento de vídeo encontre-a no bucket e inicie os trabalhos de processamento.

Existem outras ferramentas que poderíamos utilizar para construção de ambos os microsserviços. Uma das possibilidades seria a inclusão do AWS CloudFront para acelerar a entrega do conteúdo já processado em pequenos pacotes e armazenado no AWS S3. Mas todas essas mudanças e melhorias ficariam para uma segunda versão. A versão atual além de funcionar perfeitamente bem, fez com que o problema fosse resolvido de forma simples e o projeto tenha sido entregue dentro do prazo estipulado.

Quais tecnologias utilizamos para processamento de vídeo?

Antes de iniciar qualquer desenvolvimento da pipeline de processamento de vídeo, precisaria estudar algumas ferramentas e configurações de edição de vídeo no qual eu não estava completamente familiarizado. Esta etapa foi importante para entender cada uma das ferramentas antes de partir para o desenvolvimento.

Portanto Tive que responder algumas perguntas como por exemplo; o que seriam os protocolos HLS, IIS ou Dash ISO? O que significa bitrate? Baseado em meu cenário, qual o melhor codec de vídeo que eu poderia escolher? Me aprofundei para entender cada dos questionamentos e como isso poderia trabalhar de forma conjunta dentro de uma aplicação.

  1. O que significam os protocolos HLS, IIS e Dash ISO?
  • HLS (HTTP Live Stream): Lançado em 2009 pela Apple, em princípio para funcionar apenas em seus Iphones porém logo se espalhou pelo mercado e atualmente é o protocolo mais utilizado para reprodução de vídeos. As principais características do HLS é a fragmentação da mídia original em pequenos pacotes com diversas resoluções para rápida distribuição de conteúdo pela rede do usuário. Para isso ele utiliza um formato chamado m3u8, no qual é um arquivo utilizado pelos players de reprodução de vídeo para que eles consigam saber a lista de reprodução para cada resolução.

    O protocolo HLS funciona da seguinte forma: Primeiro teremos que ter a mídia original, essa mídia deve estar com uma excelente qualidade de vídeo, a resolução ideal é estar acima do 1080p.
    A mídia será dividida em centenas ou milhares de pacotes (iremos definir isso dentro da aplicação), e cada uma deles terá uma resolução específica podendo variar entre 480p, 720p ou 1080p ou nas outras resoluções que você definiu. Após dividir a mídia original em pacotes menores, será criado um arquivo chamado de m3u8 que dentro dele terá uma lista de reprodução para cada resolução. Ou seja, terá uma "link" para a lista de reprodução da resolução 1080p, 720p, 480p assim sucessivamente. Portanto os reprodutores utilizaram esse arquivo m3u8 para renderizar o vídeo em seu aparelho.

    No momento é isso é tudo que você precisará saber. Na segunda parte irei entrar em detalhes como funciona o HLS e descrever cenários práticos para melhor entendimento. Logo já adiantando que para desenvolvimento desse projeto, utilizei como protocolo de vídeo o HLS. Mas leia também os outros protocolos que poderiamos ter utilizado

  • IIS (Live Smooth Stream): O protocolo de transporte smooth streaming desenvolvido pela Microsoft, também é uma tecnologia de streaming adaptável, e utiliza o mesmo conceito do Apple HLS, ou seja utiliza-se o HTTP para transmitir suas mídias, ao player de destino. Portanto ele é bem semelhante ao HLS, porém com um diferencial, na época em que foi criado, tinha suporte a plataforma de reprodução de vídeo chamada Silverlight, no qual foi descontinuada anos depois.

  • Dash ISO: É um padrão desenvolvido pela International Organization for Standardization (ISO), esse padrão não é muito diferente dos outros dois, mantendo as mesmas características de comunicação com protocolo HTTP, reprodução adaptável entre outras características.

Baseado em meu cenário, quais os melhores codecs de vídeo que poderiamos utilizar?

Para responder essa pergunta, primeiro precisamos entender como funcionam os codecs de vídeo.

Os codecs utilizam algoritmos para comprimir a mídia em um formato compacto. O codec que utilizei para desenvolver o projeto é atualmente um dos mais populares, chamado de H-264. Ele é amplamente utilizado no mercado, porém se tivéssemos construindo o nosso próprio reprodutor de vídeo e optassemos por utilizar este codec, teríamos que adquirir uma licença de uso. Porém existem outros codecs de código aberto disponíveis no mercado como por exemplo o AV1 desenvolvido pela Alliance For Open Media

Para desenvolvimento do tech challange, estamos utilizando o AWS MediaConvert portanto não precisamos adquirir a licença de uso, pois a AWS tratou de todos esses assuntos e só precisamos utilizá-lo, sem se preocupar com esses assuntos.

Para comprimir uma mídia são utilizados algoritmos que usam as técnicas de entropia ou entropy method. O CAVLC e CABAC são alguns desses algoritmos que utilizam as técnicas de entropia para comprimir um arquivo de mídia. Para não estender muito este artigo explicando como funcionam esses algoritmos, irei deixar o link de um outro artigo que ao ler me ajudou muito no entendimento do CAVLC.

codificação de comprimento variável adaptável ao contexto

Outro ponto importante que precisamos entender é que não é trabalho dos codecs fazerem a fragmentação da mídia original, eles apenas comprimem a mídia já fragmentada para melhor distribuição do conteúdo na rede do usuário. Quem divide a mídia em multiplos pacotes menores são os protocolos de vídeo

O que é BitRate?

A configuração do bitrate é essencial para termos uma boa experiência na qualidade da imagem, pois quanto mais baixo, pior será a apresentação do vídeo, porém quanto mais alto melhor a apresentação ou seja melhor será a qualidade da imagem. Para definirmos o melhor bitrate não precisamos fazer cálculos complexos, o youtube tem uma documentação com os bitrate definidos para cada resolução. Segue a documentação disponibilizada pelo mesmo.

Para finalizarmos toda a teoria ainda precisei entender como funciona o AWS MediaConvert no qual é a ferramenta que utilizei para fazer o processamento dos vídeos. Para isso tive que acessar o AWS Skill Builder e fazer alguns cursos que explicavam como utilizar o serviço diretamente na console e também cada configuração que precisaríamos fazer, começando por enviar a mídia original, escolha do codec H-264, definindo os parâmetros de configuração de áudio e vídeo, e iniciando o processamento da mídia original e separando em pequenos pacotes e armazenando em um bucket no S3.

Segue os cursos que foram feitos no AWS Skill Builder

  • AWS Skill Builder - Setting Up and Configuring AWS Elemental MediaConvert

  • AWS Skill Builder - AWS Elemental MediaConvert Primer

  • AWS Skill Builder - Creating Adaptive Bitrate (ABR) Outputs

Após responder todas as questões e aprofundar sobre cada tema, chegou a hora de começarmos o desenvolvimento.

Desenvolvimento do projeto

Para integração com o MediaConvert temos que utilizar um SDK da AWS, para isso estou utilizando a versão 2.x do SDK da AWS.

Antes de iniciar o desenvolvimento, vamos analisar o código apresentado na documentação no item "Create Job". Veja que já conseguimos entender como fazer as configurações do áudio, a resolução que gostaríamos que as nossas mídias tenham, configuração da taxa de bitrate e codec utilizado. Ou seja, nós temos toda a base necessária para iniciarmos os trabalhos.

Observe que é um código apresentado na documentação é bastante extenso, porém no tech challenge tive que desenvolver o meu projeto baseado no que já estava disponibilizado na documentação da AWS. Já fiz o trabalho de separar cada recurso em pequenos "blocos" e adicionar as configurações necessárias para que tudo funcione conforme o esperado. Portanto disponibilizo o repositório para que possamos acompanhar e entender onde devemos encaixar cada configuração de vídeo explicada no capítulo "Quais tecnologias utilizamos para processamento de vídeo?"

O repositório, faz parte da pipeline de processamento de vídeo, nele você encontrará além da integração com o MediaConvert, também verá a integração com o S3 para que possamos pegar a média original e enviá-la para o MediaConvert, encontrará também a integração com o SQS, pois é a partir das mensagens que recebemos da fila que iniciamos a nossa pipeline de processamento de vídeo.

Para cada mídia enviada ao MediaConvert, precisará ter configurada a trilha de áudio, porém como o nosso foco não é configuração de áudio, vamos deixar da forma padrão conforme visualizamos na documentação.

https://github.com/JonasBarros1998/processamento-de-videos/blob/main/src/main/java/com/br/stream/processamentoDeVideo/infra/processarMidias/audio/TrilhasDeAudio.java

Vamos configurar os codecs de vídeo, como já foi explicado no capítulo anterior, utilizei o codec H-264, mas dentro do MediaConvert também temos disponíveis outros codecs como Dash ISO, CMAF e Microsoft Smooth Streaming.

A configuração do codec é bastante extensa, por enquanto não precisamos nos preocupar com todos os parâmetros de configuração, mas um dica valiosa que podemos seguir é entrarmos na console da AWS ir até a ferramenta MediaConvert, adicionar um grupo de saída e ao selecionar Apple HLS, veremos uma série de parâmetros a serem configurados, se observarmos os parâmetros na console AWS e observarmos os parâmetros descritos no código veremos muita semelhança, assim facilitando o nosso desenvolvimento, e o entendimento de cada item.

  • Para criar o container Apple HLS: AppleHLSContainer

  • Para configurar o segmento de cada pequeno "bloco" da mídia principal: Nesse caso utilizei um segmento igual a 10. Isso quer dizer que cada pacote deverá ter um tamanho de 10 segundos no total. Então o MediaConvert pega a mídia original divide ela em pequenos pacotes de 10 segundos para cada uma da resolução escolhida. Essa configuração está dentro da classe AppleHLSContainer. Configuração do segmento

  • Taxa de bits ou bitrate: Para configurar a taxa de bits ideal, conforme disse no capítulo anterior, utilizei as mesmas configurações do youtube para as resoluções 480p, 720p e 1080p. Definição do BitRate e configuração para resoluções 480p, 720p e 1080p

  • Configuração do codec H-264: Codec H-264

  • Outras configurações de áudio inseridas dentro do codec: Container de áudio

Portanto, este foi o trabalho desenvolvido para a fase 4 do tech challange da Fiap. Veja que para chegarmos na fase de desenvolvimento tive que entender diversas tecnologias que até momentos atrás não faziam parte do meu escopo de conhecimento. Portanto agora conseguimos entender melhor como o youtube, netflix e outros players de vídeo fazem para reproduzir aquela série que tanto gostamos em nossos aparelhos celulares ou nos computadores. Observe também que só utilizamos ferramentas AWS para salvar as nossas mídias, processá-las e entregá-las ao usuário, a utilização da AWS foi um dos pontos principais para que eu consiga ter agilidade no desenvolvimento, pois é uma nuvem no qual já tenho experiência portanto o desenvolvimento do projeto foi um pouco mais rápido.

💖 💪 🙅 🚩
jonasbarros
Jonas Barros

Posted on August 4, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related