Как уменьшить размер видео с помощью ffmpeg?

Как я могу использовать ffmpeg для уменьшения размера видео, снижая качество (как можно меньше, естественно, но мне нужно, чтобы он работал на мобильном устройстве, у которого мало свободного места)?

Я забыл написать еще одно. Когда видео может использовать субтитры (* .srt или * .sub), я бы хотел их преобразовать, чтобы соответствовать параметрам преобразованного видеофайла.

См. Этот ответ. Для удобства:

Вычислите требуемый бит, разделив 1 ГБ на длину видео в секундах. Итак, для видео длиной 16:40 (1000 секунд) используйте битрейт 1000000 байт / сек:

 ffmpeg -i input.mp4 -b 1000000 output.mp4 

Дополнительными параметрами, которые стоит рассмотреть, является установка коэффициента постоянной скорости, который снижает среднюю скорость передачи данных, но сохраняет лучшее качество. Измените CRF между 18 и 24 – чем ниже, тем выше биттрейт.

 ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4 

Если вы не ищете определенный битрейт, я бы рекомендовал параметр -crf . Это наиболее часто используется для кодирования x264 : http://slhck.info/articles/crf

Вкратце: CRF из 23 сделает фильм с качеством «DVD» (~ 700 МБ-1 ГБ), а более низкие значения CRF будут более качественными (более крупные файлы).

Вам нужно будет использовать двухпроходную кодировку для «подгонки» видео в пределах определенного размера файла (битрейт), не снижая качество слишком резко. Это довольно подробная тема: http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/

У меня есть рецепт, который я изначально подделал для себя, чтобы преобразовать видео Motion JPEG, которые генерирует моя старая камера (они очень большие видео, так как каждый кадр – целое изображение в формате JPEG) до h264. Вот адаптация для других видов видео (курсы и т. Д.).

Я не использую ffmpeg , но mplayer и mencoder . Во-первых, мы должны demux аудио с mplayer:

 mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video> 
  • Параметр -vo null и -ao null указывает mplayer не извлекать видео.

В следующих шагах мы сделаем 3-х секундное сжатие с помощью mencoder. На первом проходе мы выберем подходящую константу качества сжатия (параметр crf ) в качестве начальной точки:

 mencoder <video> -ovc x264 -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 -nosound -o video1.h264 
  • Вы можете добавить параметр slow_firstpass в -x264encopts, если вы параноик с окончательным качеством видео. В руководстве Mencoder говорится, что этот параметр отключает некоторые параметры, которые «значительно улучшают скорость кодирования при незначительном влиянии на качество окончательного прохода» или вообще не влияют на него. Поэтому используйте его только на последнем шаге.

  • Вы должны попробовать несколько значений для crf – попробуйте начать с 25 и продолжайте увеличивать его, пока не заметите артефакты в полученном видео (более высокие значения сжимаются больше). Помните, что последующие проходы кодирования улучшат качество, которое вы выбрали для crf .

  • Альтернативы для самой предварительной настройки медленнее , медленнее , средние и т. Д. См. Руководство по mencoder для полного списка.

  • ratetol управляет изменением битрейта – я не уверен, что я делаю правильные вещи здесь, но я установил его на максимальное значение, чтобы дать полную свободу для mencoder выбирать правильный битрейт для каждой сцены.

После первого прохода вы заметите, что в последней строке вы получите средний битрейт, который вы будете использовать на следующих шагах:

 (...) x264 [info]: kb/s:526.43 

Измените параметр crf , рекомендованный на первом проходе, для битрейта , необходимого для последующих проходов:

 mencoder <video> -ovc x264 -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 -nosound -o video2.h264 

Эта кодировка второго прохода будет считывать статистику, сгенерированную на первом проходе ( divx2pass.log и divx2pass.log.mbtree ), чтобы оптимизировать сжатие.

  • Обратите внимание, что вы будете использовать один и тот же видеовход, а не сгенерированный выходным видеосигналом первого прохода – первый проход, только полезно проверить начальное качество.

  • Также обратите внимание, что pass=3 ( not pass=2 ) создаст новый файл статистики, поэтому вы можете повторить последний шаг столько раз, сколько захотите. Обычно я дважды pass=3 , всегда обращая внимание на результат битрейта.

Между тем, вы также можете сжимать аудио, используя lame или oggenc :

 oggenc -q<n> <audio_pcm.wav> 

Наконец, мы будем воспроизводить аудио и видео

 mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy -of lavf -lavfopts format=mp4 -o <video>.mp4 
  • Формат -of lavf -lavfopts format=mp4 генерирует формат файла mp4 с использованием lavopts-мультиплексоров.