Como limitar o tamanho do arquivo com ffmpeg?

10

Quero codificar um vídeo, com duração de 60 segundos, para um destino ou tamanho máximo de 10 MB .

Existem duas abordagens que conheço. Um é explicado no FFMPEG-Wiki e o outro que encontrei na documentação. Infelizmente, não encontrei uma explicação sobre quando usar qual método.

Algum desses métodos é recomendado? Caso contrário, quais são as vantagens e desvantagens de cada método?

1) Calcule e defina a taxa de bits para corresponder à duração do vídeo, conforme explicado no ffmpeg-wiki

(10 MB * 8192 [converte MB em kilobits]) / 60 segundos = ~ 1365 kbits / s bitrate total 1365k - 128k (bitrate de áudio desejado) = 1237k bitrate de vídeo

ffmpeg -y -i input -c:v copy -preset medium -b:v 1237k -pass 1 -c:a copy -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -preset medium -b:v 1237k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4

2) Use o -fs parâmetro e deixe o ffmpeg descobrir.

ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
Daniel
fonte
11
No seu 1º exemplo, a primeira etapa também deve usar libx264como c:v. No fsexemplo, você não está transcodificando o vídeo, pois ele -c:v copyé usado. Portanto, o presete crftambém não tem nenhum efeito.
Gyan
Este foi útil para mim: stackoverflow.com/a/34547102/470749
Ryan

Respostas:

11

O fsparâmetro irá parar a codificação assim que atingir seu valor. Portanto, se a saída atingir a 10MBmarca ao codificar o 15º segundo, essa será a duração do seu arquivo de saída.

Se você deseja garantir que o arquivo inteiro esteja codificado, mas não ultrapasse o tamanho de destino definido, use o método de taxa de bits. Para acomodar a sobrecarga de muxing e outros dados dentro do tamanho desejado, defina a taxa de bits do vídeo um pouco mais baixa, digamos, 1-2%

Gyan
fonte