Во время самоизоляции потребовалось записать несколько видео. Запись велась на камеру смартфона в формате 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Мб.
В этом случае команда будет выглядеть вот так
где
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.
В этом случае команда будет выглядеть вот так
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.
Стоит заметить, что на этой же странице стэкексчейнджа есть ещё один рецепт для пережатия видео под формат мобильных устройств с рескейлингом.
В общем - велкам!