Archive for the ‘Codificação’ Tag

Generalizando os conceitos de Integração Contínua

A utilização de processos de integração contínua no desenvolvimento de software, é hoje algo bastante corriqueiro em ambientes onde existe uma preocupação com a qualidade do código. A implementação de testes unitários e a execução dos mesmos de forma periódica, garante que o funcionamento de cada um dos componentes seja validado, o que impede a introdução de bugs, principalmente quando estamos falando do desenvolvimento de novas funcionalidades em uma aplicação já existente. Este conceito de integração contínua é tão importante para o processo de desenvolvimento, que por várias vezes me perguntei como poderíamos generaliza-lo para utilização em situações diferentes.

Quando conhecemos a complexidade dos processos de codificação de vídeos, nos deparamos com uma imensa quantidade de variáveis que podem interferir na qualidade do vídeo codificado, de modo que é praticamente impossível garantir que um determinado processo de codificação sempre irá gerar resultados satisfatórios. Além disso, fatores externos, como sistema operacional, hardware, etc, também influenciam nos resultados obtidos, seja na velocidade de codificação, seja na própria integridade do conteúdo.

Em ambientes de produção de vídeo em alta escala, é fundamental garantir que todas as variáveis que influenciam no processo de codificação estejam sob controle, de modo que os impactos de qualquer alteração sejam rapidamente identificados, antes que elas sejam efetivamente aplicadas no ambiente de produção. Se fizermos um paralelo com os processos de desenvolvimento de software, o que precisamos é exatamente o que a execução contínua de build e testes faz, ou seja, garante que não houve quebra de funcionalidades gerada por alterações no software.

Para exemplificar, podemos citar um processo de codificação com o Windows Media Encoder (Para quem não conhece, o Windows Media Encoder é um codificador WMV da Microsoft, bastante popular para quem usa Windows Media Video). Devido à uma alteração nas bibliotecas utilizadas pelo WME feita pela atualização do SP2 do Windows XP, podemos ter um aumento no tempo de codificação, além de alguns erros com arquivos específicos. Isto significa que a simples atualização do Service Pack do sistema operacional pode influenciar bastante no processo de codificação. Se, neste cenário, temos um processo de codificação contínuo, então essas diferenças seriam facilmente identificadas, antes que esta atualização fosse efetivamente aplicada.

Entretanto, ter simplesmente um processo de codificação que roda constantemente não é o suficiente para garantirmos a integridade de um ambiente. É de fundamental importância ter uma quantidade grande de mídias de diferentes perfis, ou seja, ter diversas mídias, de diversas durações, com vários tipos de conteúdo distintos e de várias fontes diferentes. Desta forma, com uma biblioteca de conteúdo diversificada e com um processo de verificação contínuo, temos como analisar de forma eficiente um ambiente de codificação.

Outro ponto importante no processo de codificação de vídeos é que a maioria deles não é “binário”, ou seja, se você codificar o mesmo vídeo 100 vezes, você não terá a mesma saída 100 vezes. Por isso, além de codificar continuamente diversos vídeos diferentes, é bastante importante codificar o mesmo vídeo repetidamente, sendo que este vídeo deve ser escolhido dentre um universo por ser aquele que apresenta a maior taxa de erros. Desta forma, estamos introduzindo mais uma validação de integridade.

Não conheço nenhuma ferramenta pronta para execução de testes desta natureza, porém, é relativamente simples escrever uma. Claro que se você deseja um output gráfico, em tempo real, é necessário dedicar um tempo razoável para isto, mas nada que não seja justificado pelos ótimos benefícios obtidos com esta prática.

Advertisements

Analisando objetivamente a qualidade de um vídeo

Num post anterior aqui do blog, falei sobre alguns dos desafios de se produzir conteúdo em vídeo para distribuição na internet, principalmente no que se refere à relação bitrate vs. qualidade. Entretanto, não deixei claro como chegar em uma relação ideal, ou seja, o quanto podemos diminuir o bitrate de modo que a qualidade fique dentro de um limite aceitável. Na verdade, toda e qualquer análise de bitrate, codec, filtros, etc, consiste em uma avaliação direta de qualidade do vídeo. Mas como saber, de forma objetiva, se um vídeo tem ou não qualidade, já que cada pessoa tem uma percepção visual diferente?

Normalmente, quando deseja-se saber se um determinado vídeo está ou não bom, mostramos ele para outras pessoas para obter uma opinião comum. Porém, este processo não é confiável uma vez que pessoas diferentes podem ter percepções visuais e critérios de avaliação completamente diferentes. Apesar disso, este tipo de avaliação subjetiva também é importante e foi inclusive utilizado na definição do codec para o Padrão Brasileiro de TV Digital.

O método objetivo de avaliação de qualidade de vídeos e imagens mais aceito na comunidade científica hoje é o PSNR (Peak Signal Noise Ratio). Como o próprio nome já diz, o PSNR é uma relação entre o máximo possível de potência de um sinal, pela potência do ruído, quando comparamos um sinal antes e depois de um processo de degradação, sendo que a unidade utilizada para representa-lo é o dB (decibel). Aplicando este conceito em vídeos e imagens, temos que o PSNR é a relação entre a entrada e a saída de um processo de compressão com perdas, que avalia o quanto a compressão introduziu ruídos na imagem ou frame original. Matematicamente o PSNR de uma imagem de dimensão m por n é representado por:

PSNR

onde MAX é o valor máximo possível de um pixel e MSE (Mean Square Error):

MSE

Desta forma, quanto maior o valor do PSNR, maior é a relação entre a potência do sinal pela potência do ruído, o que significa melhor qualidade. Em termos gerais, valores de PSNR acima de 42dB correspondem à compressões que introduzem perdas imperceptíveis ao olho humano, o que significa uma qualidade excepcional. Podemos considerar que vídeos com PSNR acima de 36dB tem qualidade bastante aceitável, entre 30dB e 36dB teremos uma qualidade mediana e abaixo de 30dB a qualidade já é bem ruim. Abaixo temos uma comparação geral dos codecs mostrando a relação entre PSNR e bitrate:

PSNR vs. Bitrate

Para facilitar a análise do PSNR, dois dos principais softwares Open Source de codificação de vídeos (mencoder e ffmpeg) já possuem esta funcionalidade integrada, basta colocar a opção -psnr que os valores serão exibidos:

Input #0, flv, from 'xxxxxx.mp4':
  Duration: 00:01:58.7, start: 0.000000, bitrate: 128 kb/s
  Stream #0.0: Video: vp6f, yuv420p, 1280x720, 29.97 fps(r)
  Stream #0.1: Audio: mp3, 44100 Hz, stereo, 128 kb/s
Output #0, avi, to 'teste.avi':
  Stream #0.0: Video: mjpeg, yuvj420p, 1280x720, q=2-31, 0 kb/s, 29.97 fps(c)
  Stream #0.1: Audio: mp2, 44100 Hz, stereo, 64 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 434 q=24.8 LPSNR=Y:34.90 U:42.65 V:43.10 *:36.33 size= 14868kB time=14.5 bitrate=8410.7kbits/s

Assim, utilizando o PSNR podemos ter um valor numérico que representa a qualidade geral do vídeo, o que ajuda bastante quando estamos lidando com ajustes finos em parâmetros de encoding.