Я хочу закодировать видео длительностью 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
libx264
какc:v
. В этомfs
примере вы не транскодируете видео, так как-c:v copy
оно используется. Таким образом,preset
иcrf
также не имеют никакого эффекта.Ответы:
fs
Параметр остановит закодировать , когда он достигает его значение. Таким образом, если выходные данные попадают в10MB
точку при кодировании 15-й секунды, то это продолжительность вашего выходного файла.Если вы хотите убедиться, что весь файл закодирован, но не пересекает установленный целевой размер, используйте метод битрейта. Чтобы согласовать накладные расходы на мультиплексирование и другие данные с целевым размером, установите битрейт вашего видео немного ниже, скажем, на 1-2%.
источник