Compressão de vídeo com ffmpeg - qualidade constante

1

Estou tentando compactar vídeos de 10 segundos em taxas de bits diferentes com ffmpeg. Meu objetivo é obter o mesmo vídeo em diferentes qualidades (de muito baixo a muito alto). Eu não quero tocar parte de áudio e estou usando H264 como um codec de vídeo. Eu estou usando o seguinte CLI:

ffmpeg -i input.mkv -c:v libx264 -b:v $j'k' -c:a copy output.mkv

Onde $ j varia de 150 a 4000.

Meu problema é que eu recebo vídeos 10s compactados, mas a qualidade não é constante durante todo o tempo. Aqui está um exemplo: Com uma taxa de bits muito baixa ($ j = 150), no início (entre 0 e 3s), o vídeo é realmente ruim, mas no final (entre 8 e 10s), a qualidade é adequada! Além disso, enquanto assiste ao vídeo, pode-se ver esse aumento de qualidade ao longo do tempo. Alguém pode me explicar esse fenômeno? Como obter uma qualidade constante?

Obrigado '

    
por MarAja 04.07.2013 / 11:40

1 resposta

2

Como @LordNeckbeard já aponta, a taxa de bits constante não é a mesma que a qualidade constante. Na verdade, é exatamente o oposto. Certas partes de sequências de vídeo são mais fáceis de codificar do que outras (mais fáceis no sentido de exigir menos bits) e outras não. Se você gastar todos os seus bits nas partes fáceis, você não terá as partes mais difíceis.

É aí que a qualidade constante entra em jogo. Em x264 existe o Fator de Taxa Constante , que faz exatamente isso. Eu sugiro que você leia o artigo vinculado, se você quiser mais informações de fundo. Basicamente, o CRF varia de 0 (sem perda, melhor) a 51 (pior). Etapas de ± 6, aproximadamente, igual a metade ou a metade da taxa de bits.

Então, para adaptar seu script, simplesmente faça algo como o seguinte:

for i in $(seq 0 5 51); do 
  ffmpeg -i input.mkv -c:v libx264 -crf $i -c:a copy output-$i.mkv
done

A escala em si é, a menos que esteja errada, próxima de logarítmica em termos de qualidade, para que você possa calcular suas etapas com base nisso em vez da chamada seq .

With a very low bitrate ($j = 150), at the beginning (between 0 and 3s), the video is really poor but at the end (between 8 and 10s), the quality is proper! Besides, while watching the video, one can see this increasing of quality through the time. Can someone explain me this phenomenon?

A taxa de bits constante não é uma tarefa fácil para um codificador. Você dá um certo valor para trabalhar, por exemplo diga "me dê 150 kBit por segundo", mas o codificador nem sabe o que vai codificar no próximo quadro.

Então, quanto deve gastar com esse frame? Quanto no próximo? Alguns quadros - como mencionei acima - são fáceis de codificar e bastam alguns kilobits, enquanto outros podem levar muito mais. Mas o codificador pode realmente apenas olhar para o que foi codificado no passado, a fim de escalar para imagens futuras. Além disso, leve em consideração os diferentes tipos de imagens .

Algoritimicamente, fazer uma taxa de bits constante é realmente difícil, e é também o pior dos modos de controle de taxa que o x264 tem a oferecer. Especialmente para clipes curtos, uma vez que o codificador não sabe o que pode esperar sem fazer uma codificação de 2 passagens, você pode perceber isso da maneira que descreve: a qualidade muda drasticamente durante os dez segundos. Mas 150 kBit / s realmente não é suficiente para vídeo de dimensões decentes de qualquer maneira.

    
por 05.07.2013 / 14:17