пятница, 24 апреля 2020 г.

Как уменьшить размер видеофайла MP4 изменив битрейт оригинального файла с помощью ffmpeg

Во время самоизоляции потребовалось записать несколько видео. Запись велась на камеру смартфона в формате MP4 с параметрами HD 720p, 30fps. Файл получился достаточно большой - 1 Гб.

С одной стороны, это хорошо. Качество не теряется, картинка чёткая, всё хорошо.

С другой стороны - такой файл мало пригоден для трансляции в веб, например через YouTube. Проблема даже не в качестве 720p, а в большом битрейте. Битрейт результирующего файла оказался выше 14000 kbps, в то время когда рекомендованный для стрима в YouTube битрейт составляет всего от 1500 до 4000 kbps.


Возникает вопрос - что делать, как понизить битрейт у видео, так, чтобы и качество не слишком пострадало и синхронизация с аудиодорожкой была как в исходном видео?

Поскольку я работаю в Linux, решение стал искать под эту платформу. 

Для решения этой задачи можно воспользоваться мощным инструментом - программой (утилитой) ffmpeg. Эта утилита доступна и под Windows и под Mac также.


Поиск в Интернет привёл на широко известный сайт.

Там указан рецепт - что нужно делать, и почему именно так.

Вкратце - команда для уменьшения размера исходного файла выглядит так:

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

Пишут, что в 2020 есть новая опция вместо libx254 - libx265 и с ней нужные параметры. Я воспользовался вышеприведённой командой и в результате получил файл почти такого же качества с битрейтом 3914 kbps и размером вместо 1Гб всего 300Мб.

В этом случае команда будет выглядеть вот так

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4


где

input.mp4 - входящий (исходный) файл
libx265 - библиотека обработки
crf - constant rate factor, при значении 23 даёт качество близкое к формату DVD, а понижение значения этого параметра вызовет увеличение качества файла и, соответственно, увеличение результирующего размера.
output.mp4 - результирующий файл


При значении crf=28 из файла размером 3,5 Гб результрующий файл получился размером 122 Мб с битрейтом 356 kbps.
При значении crf=23 из файла размером 3,5 Гб результрующий файл получился размером 255 Мб с битрейтом 894 kbps.
При значении crf=20 из файла размером 3,5 Гб результрующий файл получился размером 435 Мб с битрейтом 1620 kbps.

Все файлы разрешением 1280х720.

Исходя из вышеприведённой таблицы с Гугл, меня устроил вариант со значением crf=20.

Стоит заметить, что на этой же странице стэкексчейнджа есть ещё один рецепт для пережатия видео под формат мобильных устройств с рескейлингом. 

В общем - велкам!