Conversão de passe único VP8 com boa qualidade em ffmpeg

1

Estou trabalhando em um programa raw to timelapse e estou usando o ffmpeg para gerar um vídeo a partir de uma sequência de JPGs que meu programa gera.

O usuário pode selecionar diferentes codecs, como libx264, mjpeg, vp8, vp9.

Estou obtendo bons resultados com h264 e mjpeg, mas vp8 me dá alguns vídeos muito ruins, mesmo que eu tenha definido a qualidade bem alta, e o tamanho do arquivo é comparável aos de h264. / p>

Estou usando as seguintes configurações:

ffmpeg.exe -framerate 12 -i "./output/img_%05d.jpg" -dst_range 1 -color_range 2 -c:v libvpx -b:v 0 -threads 8 -speed 2 -crf 8 "./output/video.webm"

Você pode ver um exemplo de vídeo aqui: link (os problemas de codificação são visíveis principalmente após 9 segundos).

Alguém no Stack Overflow disse que o VP8 precisa de dois passes, mas isso não é prático. É possível obter bons resultados em um único passe? Algo comparável ao h264 em termos de tamanho / qualidade?

    
por Radu 26.12.2017 / 22:59

2 respostas

0

Embora a qualidade percebida seja subjetiva, você pode ajustar a qualidade geral usando a variável -quality , por exemplo -quality good . A taxa de bits afetará a qualidade que você definiu como 0, o que presumo ser um erro.

    
por 27.12.2017 / 00:31
3

A única maneira de obter resultados de boa qualidade em uma única passagem é usar um fator de taxa constante ( CRF ). Por favor, leia o VP8 e VP9 guias para mais informações.

Ao definir -crf X , cada quadro é codificado com esse nível de qualidade de destino X . No entanto, uma restrição adicional é aplicada no codificador, dependendo da taxa de bits definida por -b:v :

  • Se -b:v 0 for usado, a taxa de bits pode variar livremente dependendo da sequência de origem e da qualidade de destino definida. Esta é a opção que você deseja para um “modo CRF normal”, equivalente a -crf X com x264 .

  • Se -b:v for definido como uma taxa de bits positiva, essa restrição será usada como uma taxa de bits máxima.

    Por exemplo, com o VP8, usar -crf 10 e -b:v 500K para um vídeo 1080p sempre reduzirá a taxa de bits para 500 kBit / s em vez de permitir que a qualidade varie livremente, fazendo com que a saída pareça ruim, já que 1080p vídeo requer muito mais do que 500 kBit / s. A configuração de -crf 10 -b:v 5M faria mais sentido para o VP8. Para o VP9, você geralmente deseja valores mais baixos de taxa de bits, já que é mais eficiente.

  • Se -b:v não for definido, o ffmpeg escolherá um padrão de 200 kBit / s, o que provavelmente resultará em má qualidade (a menos que você tenha uma seqüência de baixa resolução, fácil de codificar). Então, não faça isso quando usar -crf .

Você pode verificar as configurações do codificador observando a saída produzida pelo ffmpeg quando executada com a configuração -loglevel debug .

No seu caso específico, não vejo nada de errado com as opções, exceto talvez -speed 2 . Definir isso desativará alguns recursos do codificador em detrimento da precisão do controle de taxa. Remova a opção e veja se isso melhora sua qualidade.

Observe que a opção -quality é enganosa; é uma opção legada agora chamada -deadline (veja ffmpeg -h encoder=libvpx para mais informações). As únicas configurações viáveis para -quality são good ou best (e realtime , mas isso é para transmissão ao vivo). good é o padrão, então você não precisa especificá-lo explicitamente. best resultará em tempos de codificação muito longos.

    
por 27.12.2017 / 11:51