Как ограничить размер файла с помощью ffmpeg?

10

Я хочу закодировать видео длительностью 60 секунд до целевого или максимального размера 10 МБ .

Есть два подхода, которые я знаю. Один объясняется в FFMPEG-Wiki, а другой я нашел в документации. К сожалению, я не нашел объяснения, когда использовать какой метод.

Любой из этих методов рекомендуется? Если нет, каковы плюсы / минусы каждого метода?

1) Рассчитайте и установите битрейт, чтобы он соответствовал длине видео, как описано в ffmpeg-wiki.

(10 МБ * 8192 [преобразует МБ в килобиты]) / 60 секунд = ~ 1365 кбит / с общий битрейт 1365k - 128k (требуемый битрейт аудио) = 1237k битрейт видео

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) Используйте -fs параметр и дайте ffmpeg понять это.

ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
Даниил
источник
1
В вашем первом примере, первый шаг также должен использовать libx264как c:v. В этом fsпримере вы не транскодируете видео, так как -c:v copyоно используется. Таким образом, presetи crfтакже не имеют никакого эффекта.
Гянь
Это было полезно для меня: stackoverflow.com/a/34547102/470749
Райан

Ответы:

11

fsПараметр остановит закодировать , когда он достигает его значение. Таким образом, если выходные данные попадают в 10MBточку при кодировании 15-й секунды, то это продолжительность вашего выходного файла.

Если вы хотите убедиться, что весь файл закодирован, но не пересекает установленный целевой размер, используйте метод битрейта. Чтобы согласовать накладные расходы на мультиплексирование и другие данные с целевым размером, установите битрейт вашего видео немного ниже, скажем, на 1-2%.

Gyan
источник