Respostas:
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, eles estão errados. O uso sameq
não fornece um resultado com a mesma qualidade da entrada.
Nunca o use.
A fonte da confusão foi uma documentação mal escrita que implicava que o uso dessa opção forneceria a mesma qualidade. Felizmente, a opção foi removida.
Aqui está o que a documentação do FFmpeg disse:
Observe que isso não é a mesma qualidade. Não use essa opção, a menos que saiba que precisa.
De fato, os desenvolvedores do FFmpeg mudaram o nome de sameq
para same_quant
apenas para ter certeza e depois removeram sameq
/same_quant
completamente; significando que essa opção não existe no FFmpeg recente, mas este artigo ainda é útil para aqueles que usam versões mais antigas do FFmpeg.
Agora que esclarecemos isso, vamos entrar em alguns detalhes técnicos.
Para entender por que não funciona de maneira confiável, precisamos entender o conceito do que "qualidade" significa para um codificador de vídeo comum e o que influencia a qualidade. Por que um vídeo parece melhor que o outro quando compactado com taxas de bits diferentes? O que torna uma conversão com perda e por que o vídeo é menor que o original após a codificação?
Quando você codifica o vídeo, seus dados de entrada são convertidos em uma dimensão diferente aplicando primeiro uma transformação matemática em blocos de pixels. Essa transformação, principalmente uma Transformação discreta de cosseno , produz uma matriz de números que descrevem, digamos, um campo de 8 × 8 pixels no vídeo.
Portanto, seus 8 × 8 pixels e a matriz correspondente teriam a seguinte aparência: 1
Mas esses são dados demais! Se queremos compactar o vídeo, podemos nos livrar dos números no canto inferior direito. Não vou explicar por que isso é exatamente, mas digamos que os números no canto superior esquerdo são mais importantes ao descrever esse bloco. Toda a idéia 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 é "nada", ou apenas se repete como 0
s, não precisaremos armazená-lo, e assim economizaremos espaço. Matematicamente, precisamos quantificar essa primeira matriz aplicando outra matriz, uma "matriz de quantização".
Isso resultará em uma matriz que agora possui 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 possui menos números para descrever esses pixels. Se você comparar o bloco visualmente, eles são semelhantes, mas não são mais os mesmos.
Aqui, a matriz de quantização determina a qualidade . Isso é importante. Podemos usar diferentes matrizes de quantiização para diferentes qualidades. Algumas matrizes de quantização deixam a matriz original quase intacta, outras não. Quanto mais números removermos, pior será a qualidade, mas mais podemos comprimir o vídeo, porque podemos basicamente "jogar fora" os zeros aqui.
sameq
?Vamos supor que você codifica um vídeo e deseja definir uma certa qualidade. Como já aprendemos, diferentes matrizes de quantização levam a uma qualidade diferente; portanto, quando dizemos ao codificador para usar a qualidade x
, ele seleciona 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ê possui uma versão não recente do FFmpeg, ainda pode encontrá-la em ffmpeg --help
:
ffmpeg --help 2>&1 | grep sameq
Portanto, quando você agora pega o vídeo convertido e o codifica novamente e aplica a sameq
opção, o FFmpeg, simplesmente falando, seleciona as mesmas matrizes de quantização usadas para o vídeo de entrada.
Isso funciona um pouco 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 porque a codificação de algo que já está codificado descartará ainda mais informações. No exemplo acima, criaremos ainda mais zeros em nossa matriz e o resultado parecerá pior.
Ele não funciona 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 têm os mesmos coeficientes. Portanto, essa opção nem faz sentido! Infelizmente, o FFmpeg ainda permite que você o use.
Conclusão: não use essa opção, a menos que saiba especificamente o que está fazendo. Se você quiser codificar seu vídeo com um codec diferente, mas manter a qualidade, precisará experimentar e definir a qualidade sozinho. Veja se o resultado é satisfatório e, se não, defina uma qualidade mais alta. Isso é o máximo que você pode fazer.
Por fim, se você quiser ler sobre como manter sua qualidade ao recodificar, confira estas postagens:
1) A matriz não corresponde à imagem aqui, realmente. Este é apenas um exemplo.
2) Atualmente, a maioria dos processos de codificação não usa apenas uma matriz. Quando você define uma determinada taxa de bits, o codificador usa matrizes diferentes para obter uma taxa de bits média por segundo. Da mesma forma, ao definir uma certa 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 exigem 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
. Também não use isso. Estou falando sério.
-sameq
opção foi preterida e, em seguida, removida do avconv