Qual é a melhor maneira de converter um arquivo mp4
em webm
sem perda de qualidade (usando vp8
ou vp9
) com ffmpeg?
Se eu fizer ffmpeg -i in.mp4 out.webm
, a qualidade é muito ruim. Posso especificar uma taxa de bits desejada por meio de -b:v
e modo de qualidade constante por meio de crf
, ou seja,
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Isso dá melhor qualidade. No entanto, para isso, tenho que pesquisar a taxa de bits do vídeo de entrada (aqui 1M).
Também notei que se você especificar um valor muito maior para a taxa de bits alvo do que a taxa de bits de entrada (aqui por exemplo -b:v 100M
), ffmpeg parece use aproximadamente a taxa de bits do vídeo de entrada com vp9 ou uma taxa de bits ligeiramente mais alta com vp8. No entanto, esta solução não parece ser a maneira pretendida de fazer isso.
Como você escolheria o valor crf e por quê?
Existe um parâmetro que escolhe automaticamente a taxa de bits de o arquivo de entrada e um valor crf adequado para obter a mesma qualidade do arquivo de entrada?
Comentários
- Defina a taxa de bits como 0. E experimente crf . Mas o seu método de alta taxa de bits também funciona, já que o valor atua como um teto e não como um alvo
- @Mulvya: A taxa de bits 0 significa que não há limite? Eu não ' encontre isso na página de manual.
- Com a taxa de bits não definida como zero, o CRF é restringido por esse valor. Com o zero, ele ' não. É ' uma peculiaridade dos codificadores VPn.
- Ok, mas se eu omitir o parâmetro de taxa de bits completamente, a qualidade fica muito ruim, mesmo que eu não ' para fornecer um limite superior para a taxa de bits.
- Link para 200k (ver primeiro opti sobre). Para WebM b: v 0, consulte esta página .
Resposta
Resposta
Use o modo de qualidade constante de duas passagens: ¹
ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
Explicação:
Definir a taxa de bits do vídeo para zero enquanto especifica o CRF (fator de taxa constante) ativa o modo de qualidade constante, que visa um determinado nível de qualidade perceptual. Para VP9, o CRF pode variar de 0 (melhor qualidade) a 63 (menor tamanho de arquivo).
É importante definir a taxa de bits do vídeo para zero. Se você não especificar uma taxa de bits de vídeo, o padrão é algo baixo, o que leva você ao modo Qualidade restrita , onde cada quadro tem uma taxa de bits máxima. Embora possa ser útil para streaming, ele reduz a qualidade significativamente, pois os quadros com muito movimento não terão a largura de banda necessária para ter uma boa aparência.
Outra razão pela qual você está perdendo qualidade é que webm
(VP9) prefere codificar em duas passagens para obter melhores resultados. A primeira passagem compila estatísticas sobre o vídeo, que são então usadas na segunda passagem para fazer um vídeo menor e de qualidade superior.
Consulte a documentação do ffmpeg VP9 se desejar saber mais.
Uma palavra sobre transcodificação
A propósito, em geral, formatos de transcodificação (pegar um vídeo compactado e recompactá-lo com um codec diferente) é uma má ideia, pois você não apenas adicionará os erros normais da codificação de vídeo com perdas, mas também desperdiçará bits no novo formato tentando preservar os artefatos do antigo.
Se você significa “sem perda de qualidade” literalmente
A opção -lossless 1
do codificador VP9 do ffmpeg ativa o modo de qualidade sem perda, mas com um aumento potencialmente enorme no tamanho do arquivo.
Tudo que você precisa é isto:
ffmpeg -i input.mp4 -lossless 1 output.webm
Quando eu tentei -lossless 1
em uma mp4
, o webm
resultante era 100 × maior, o que não era um aceitável para mim. No entanto, se seus mp4
arquivos já forem de alta qualidade, espero que a diferença de tamanho não seja tão grande.
Nota de rodapé 1: se você “Ao usar Microsoft Windows em vez de UNIX, altere /dev/null
para NUL
.
Comentários
- Ótima resposta, obrigado
-
/dev/null
? O que isso significa? Qual seria o equivalente para usuários do Windows? Você está substituindoinput.mp4
na primeira passagem? Esta resposta precisa de mais explicações sobre o que exatamente cada componente está fazendo. Ele não ' oferece aos usuários intermediários muitas explicações sobre como funciona. - Olá, amigo do ódio: minha resposta já inclui uma longa seção de explicação e um link para mais informações, então ' prefiro não torná-la mais longa. Você viu a nota de rodapé sobre o Microsoft Windows que responde à sua pergunta específica? Além disso, como mencionado acima, o primeiro passo compi menos estatísticas sobre o arquivo de entrada.Não há necessidade de temer que ele possa sobrescrever a entrada.
- Tentei converter o arquivo .MTS para .webm usando esses dois comandos (Ubuntu 20.10, ffmpeg versão 4.2.2). Mas tenho erros: " Layout de canal 5.1 (lado) inválido para a família de mapeamento -1 especificada. Erro ao inicializar o fluxo de saída 0: 1 – Erro ao abrir o codificador para o fluxo de saída # 0: 1 – parâmetros talvez incorretos, como bit_rate, taxa, largura ou altura "
- obrigado pela resposta. se a transcodificação é geralmente uma má ideia, o que você recomendaria se precisar converter vídeos mp4 para webm e vídeos webm para mp4?
Resposta
No Linux, uso optimizeVideo , que é um wrapper em torno do ffmpeg que detecta automaticamente essas configurações de acordo com Recomendações do Google .
O resultado é um vídeo cuja diferença de qualidade você não pode dizer, mas geralmente em ordens de magnitude menor.