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
libx264
comoc:v
. Nofs
exemplo, você não está transcodificando o vídeo, pois ele-c:v copy
é usado. Portanto, opreset
ecrf
também não tem nenhum efeito.Respostas:
O
fs
parâmetro irá parar a codificação assim que atingir seu valor. Portanto, se a saída atingir a10MB
marca 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%
fonte