atingindo taxa de bits de vídeo constante usando ffmpeg

2

Usamos ffmpeg e um script de transcodificação para transcodificação e queremos fazer alguns arquivos em lote que podemos usar para transcodificação.

Por exemplo, eu uso um parâmetro chamado video_kbit e, se estou escrevendo em 30000, ele deve chegar a 30 Mbit. É claro que se eu usar 6000 como parâmetro, ele deve atingir 6 MBit também, então eu tenho um script que atinge cada bitrate de vídeo que eu quero.

Como minhas configurações são agora, eu só alcanço 18,1 Mbit. Somente quando uso o 15000 como parâmetro, estou atingindo minha meta para uma taxa de bits de vídeo constante de 15 MBit. Se eu usar 8000 como parâmetro, recebo 10,1 MBit como resultado. Então, com menos de 15000, eu obtenho uma taxa de bits maior e mais de 15000, eu obtenho uma taxa de bits menor do que eu quero.

Minhas predefinições são:

ffmpeg -threads "4" -i "$2"  -f mp4 -c:v libx264 -crf 1 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-acodec libfaac -ac 2 -ab ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -vf scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

E estou usando esses parâmetros:

FC_PARAM_video_kbit = 30000
FC_PARAM_audio_kbit = 192
FC_PARAM_width = 1920
FC_PARAM_height = 1080

Eu tentei usar um tamanho de buffer maior e usar profile:v e configurações de nível, mas nada me aproximou da taxa de bits de vídeo constante de 30000 Mbit.

Vocês têm alguma idéia ou sugestão de uma maneira melhor de alcançar meu objetivo?

    
por sebastian 23.10.2013 / 11:47

1 resposta

2

Definir o CRF (um modo de qualidade constante ) e uma taxa de bits de vídeo ao mesmo tempo não faz qualquer sentido. Você quer um desses, exclusivamente.

Para alcançar uma taxa de bits fixa, você deve definir minrate , maxrate e b:v para o mesmo valor. Seu script se pareceria com algo assim (mas o ideal é que você altere bufsize também):

ffmpeg -threads "4" -i "$2" -c:v libx264 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-minrate ${FC_PARAM_video_kbit}k -b:v ${FC_PARAM_video_kbit}k \
-c:a libfaac -ac 2 -b:a ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -filter:v scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

Mas, novamente, isso faz sentido? A questão é o que você realmente precisa alcançar. Raramente há um ponto em forçar uma alta taxa de bits quando ela não oferece melhor qualidade visual (e apenas tamanhos maiores de arquivos). Querer 30 MBit / s para vídeo x264 - mesmo que seja conteúdo HD 1080p - parece um pouco exagerado para mim. *

O x264 é ótimo para oferecer uma qualidade realmente boa se você definir um CRF baixo o suficiente. Qualquer coisa abaixo de 17 ou 18 deve ser imperceptível em termos de distorção visual, e um CRF de 0 significa codificação sem perdas. Em vez disso, defina o CRF para um valor que pareça bom o suficiente para você e não se preocupe com a taxa de bits. É realmente um tipo de opção de definir e esquecer que você pode aplicar a lotes de vídeo para obter uma saída de qualidade semelhante.

Por fim, não se esqueça que se, digamos, um segundo de vídeo puder ser compactado sem perdas (ou seja, com CRF 0) em apenas 10 MBits, a configuração da taxa de bits para 30 MBit / s não forçará essa parte do vídeo para realmente consumir 30 MBit. O x264 não "cria" informações apenas para aumentar a saída para uma taxa de bits solicitada. Ficará em 10 MBit.

* Se você quiser arquivar ou distribuir o vídeo para processamento posterior, escolha um codec intermediário como ProRes ou DNxHD.

    
por 23.10.2013 / 11:59