Freqüentemente, vi comandos FFmpeg usando a sameq
opção, por exemplo
ffmpeg -i input.mp4 -sameq output.avi
O que isto significa? Significa "mesma qualidade"? Se não, o que devo usar?
Responder1
sameq
não significa "mesma qualidade"
Vários recursos na web promovem o uso da opção sameq
ou same_quant
, mas, em essência, estão errados. Usar sameq
não fornece um resultado com a mesma qualidade da entrada.
Não use, nunca.
A fonte da confusão foi a documentação mal escrita que implicava que o uso desta opção forneceria a mesma qualidade. Felizmente, a opção foi removida.
Aqui está o que a documentação do FFmpegdisse:
Observe que esta NÃO É A MESMA QUALIDADE. Não use esta opção a menos que saiba que precisa dela.
Na verdade, os desenvolvedores do FFmpeg tinhammudou o nomede sameq
para same_quant
apenas para ter certeza, e entãoremovido sameq
/same_quant
completamente; o que significa que esta opção não existe no FFmpeg recente, mas este artigo ainda é útil para aqueles que usam compilações mais antigas do FFmpeg.
Como funciona a compactação de vídeo?
Agora que esclarecemos isso, vamos entrar em alguns detalhes técnicos.
Para entender por que ele não funciona de maneira confiável, precisamos compreender o conceito do que “qualidade” significa para um codificador de vídeo comum e o que influencia a qualidade. Por que um vídeo fica melhor que o outro quando compactado com taxas de bits diferentes? O que torna uma conversão com perdas e por que o vídeo fica menor que o original após a codificação?
Quando você codifica vídeo, seus dados de entrada são convertidos em uma dimensão diferente aplicando primeiro uma transformação matemática a blocos de pixels. Esta transformação, principalmente umaTransformada Discreta de Cosseno, produz uma matriz de números que descreve, digamos, um campo de 8×8 pixels no vídeo.
Portanto, seus 8×8 pixels e a matriz correspondente inicialmente ficariam assim: 1
Mas isso são muitos dados! Se quisermos compactar o vídeo, podemos nos livrar dos números no canto inferior direito. Não vou explicar exatamente por que isso acontece, mas digamos apenas que os números no canto superior esquerdo são mais importantes ao descrever tal bloco. A ideia da transformação é basicamente colocar as coisas importantes no canto superior esquerdo.
Para remover os números no canto inferior direito, podemos torná-los zeros. Se algo for "nada", ou apenas repetir como 0
s, não precisaremos armazená-lo e assim economizaremos espaço. Matematicamente, precisamosquantizaresta primeira matriz aplicando outra matriz, uma "matriz de quantização".
Isso resultará em uma matriz que agora contém consideravelmente menos números e muitos zeros:
O resultado disso é que transformamos a primeira matriz de alta qualidade com muitos números em uma matriz que ainda se assemelha aos mesmos 8×8 pixels, mas com menos qualidade porque tem menos números para descrever esses pixels. Se você comparar o bloco visualmente, eles serão semelhantes, mas não mais iguais.
Aqui,a matriz de quantização determina a qualidade. Isso é importante. Podemos usar diferentes matrizes de quantização para diferentes qualidades. Algumas matrizes de quantização deixam a matriz original quase intacta, outras não. Quanto mais números removemos, maispiora qualidade vai melhorar, mas omaispodemos compactar o vídeo, porque basicamente podemos “jogar fora” os zeros aqui.
O que isso tem a ver sameq
?
Vamos supor que você codifique um vídeo e queira definir uma determinada qualidade. Como já aprendemos, matrizes de quantização diferentes levam a qualidades diferentes, portanto, quando dizemos ao nosso codificador para usar qualidade x
, ele selecionará a matriz de quantização apropriada y
para obter essa qualidade, seja ela qual for. O resultado é um vídeo que foi compactado usando a y
matriz. 2
E aqui está a parte interessante:sameq
significa "mesmo quantizador". Não "mesma qualidade".Se você tiver uma versão não recente do FFmpeg, ainda poderá encontrá-la em ffmpeg --help
:
ffmpeg --help 2>&1 | grep sameq
Então, quando você pegar o vídeo convertido e codificá-lo novamente, e aplicar a sameq
opção, o FFmpeg irá, simplesmente falando, selecionar as mesmas matrizes de quantização que foram usadas para o vídeo de entrada.
Essede alguma formafunciona quando você usa exatamente o mesmo codec para entrada e saída, por exemplo, ao converter de um vídeo XviD para um vídeo XviD, mas você ainda terá uma qualidade pior. 3 Isso ocorre porque codificar algo que já está codificado irá desperdiçar ainda mais informações. No exemplo acima, criaremos ainda mais zeros em nossa matriz e o resultado ficará pior.
Isso acontecenãofuncionam em diferentes codecs de vídeo. Digamos que você esteja convertendo um vídeo codificado em XviD com x264. 4 Para esses dois codecs, as matrizes de quantização usadas internamente são diferentes — elas não possuem os mesmos coeficientes. Então essa opção nem faz sentido! Infelizmente, o FFmpeg ainda permite que você o use.
Resumindo: não use essa opção a menos que você saiba especificamente o que está fazendo. Se quiser codificar seu vídeo com um codec diferente, mas manter a qualidade, você terá que experimentar e definir você mesmo a qualidade. Veja se o resultado é satisfatório e, caso contrário, defina uma qualidade superior. Isso é tudo que você pode fazer.
Por fim, se você quiser ler sobre como manter a qualidade ao recodificar, confira estas postagens:
- Como posso recodificar vídeo H.264 com perda mínima de qualidade?
- Configurações do freio de mão para converter MKV em MP4, mantendo a qualidade original
- Converta vídeos antigos para tamanhos menores
- Quais parâmetros devo observar para reduzir o tamanho de um arquivo .MOV?
1) A matriz não corresponde à imagem aqui, na verdade. Este é apenas um exemplo.
2) Na verdade, hoje em dia, a maioria dos processos de codificação não usa apenasummatriz. Quando você define uma determinada taxa de bits, o codificador usará matrizes diferentes para obter uma taxa média de bits por segundo. Da mesma forma, ao definir uma determinada qualidade, os codificadores modernos empregam matrizes diferentes dependendo do conteúdo. Isso ocorre porque alguns conteúdos são “mais fáceis” de compactar do que outros e requerem menos quantização para obter o mesmo fator de compactação.
3) Exemplo: ffmpeg -i input.avi -sameq -c:v libxvid output.avi
. Não use isso. Por favor.
4) Exemplo: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4
. Não use isso também. Estou falando sério.