Последнее обновление:
Оптимизируем размер видеофайла
Как оптимизировать размер видео в LINUX Ubuntu? Это очень просто. При помощи утилиты ffmpeg.
В смысле – как снизить размер файла видео так, чтобы оно практически не потеряло в качестве.
Например, Вы записали видео на телефоне/смартфоне и решили снизить его объем, чтобы оно не занимало много места на жестком диске компьютера. Это тем более актуально, если видеофайл будет размещен на видеохостинге. Скажем, Youtube пока не очень лимитирует размеры видеофайлов, а вот если размещать видео где-то на "своем" хостинге - вот тут размер будет очень даже критичным аспектом.
В Windows (по крайней мере, вплоть до Windows 7 включительно) штатные средства для оптимизации видео отсутствуют. Поэтому там приходится применять разного рода конвертеры. А их еще надо где-то найти и скачать (на свой собственный страх и риск, разумеется). А вот в Linux есть достаточно функциональная команда-утилита:
ffmpeg
Чтобы не тратить времени на общие слова, перейдем сразу к делу. Допустим, у нас есть файл видео в формате MP4 и мы хотим оптимизировать его. Исходное имя файла input.mp4, выходное – output.mp4.
Следует открыть консоль Linux (в том каталоге, в котором находится файл input.mp4) и ввести следующую команду:
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M -strict -2 output.mp4
Такая команда работает, в частности, в Linux Ubuntu 16.04.4 LTS.
Для больших файлов утилита будет работать некоторое время. Например, файл в формате mp4 размером пару сотен мегабайт может обрабатываться пару минут.
В итоге на выходе получаются видеофайлы, в самом деле, гораздо меньшего объема, но практически не потерявшие в качестве, в частности, если смотреть их на экране размерами 1920*1080 пикселей.
Past duration 0.744331 too large
Так, файл размером примерно 30 МБ уменьшился до 3 МБ (три мегабайта!). Файл размером 180 МБ сжался до 20 МБ с небольшим. И так далее.
Однако, на качество получающегося в результате видео это не влияет.
Вот, кстати, типичный пример НЕоптимизированного видео:

При длительности всего лишь… 3 минуты 14 секунд размер видео составляет целых 188 МБ. Разумеется, из-за этого видео практически невозможно смотреть, так как оно постоянно прерывается в результате недостаточной скорости сетевого соединения.
Впрочем, по поводу его просмотра. Думается, это – одно из направлений нынешней ювенальной пропаганды. Какие, мол, родители нынче жестокие, нужно детей поскорее от них отнимать. Вот и принимают потом ТАКИЕ законы, что…
Теоретически, конечно, есть вероятность, что, в самом деле, есть матери-идиотки, кои способны на подобные издевательства. Но, судя по некоторым деталям в видео (не будем здесь обсуждать, по каким именно – чтобы не создавать базу знаний для психологов – распространителей ювенальных технологий), по его общей компоновке… создается определенное впечатление, что сие дело было – банально сфабриковано. Уж очень оно напоминает типичный пропагандистско-новостной клип. Да, накидать людям эмоций, бросить в глаза КРАЙНЕ МАЛУЮ(!) толику обескураживающих фактов – и вскорости замолчать. Да, знакомо всё это, уже в течение 20 последних лет. Именно по такой схеме работают достаточно многие популярные СМИ, особенно телевидение, радио. Собственно, это – один из стандартных приемов НЛП (нейролингвистического программирования).
Скорее всего, или та приемная мать «перешла дорогу» кое-кому (типа местных или НЕместных блатных ад министраций), или еще что. Например, отказалась от вакцинации или цифровизации. А детишек – их вполне и подговорить могли. Угрозами или обещаниями «золотых гор». Тем более, ведь, видимо, практически у КАЖДОГО ребенка в любой семье могут быть хоть какие-то, хоть минимальные обиды, непонимания в отношении его родителей. Тем более, приемных родителей. Ну, а уж усилить это, дорисовать детали, и в итоге – «обнаружить» нарушения закона – вот тут уж и психологи вполне могли «помочь». Очень сомнительное видео.
Как это характеризовать? Как безответственность со стороны разработчиков сайта – тех, кто разместил видео? Мол, пользователям «и так пойдет»? Впрочем, какая разница. Хотя, оптимизировать это видео можно было бы в течение пары минут и его размер составил бы несколько десятков мегабайт, не больше (см. выше).
Как оптимизировать видео и масштабировать его?
Для этого применяется параметр scale. Например: scale=150:100
означает, что видео будет масштабировано к выходным размерам в 150px шириной и 100px высотой.
Если хочется сделать масштабирование, чтобы один из параметров, например, высота определялся автоматически в зависимости от заданной ширины, тогда scale=150:-1. Команда может иметь такой вид:
ffmpeg -i input.mp4 -vf scale=150:-1 -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M -strict -2 output.mp4
Видео будет масштабировано до ширины 150рх, при этом высота будет масштабирована автоматически, исходя из соотношения между шириной и высотой. И, кроме того, его размер и качество будут соответствующим образом уменьшены.
Бывают, однако, ситуации, когда соотношение размеров видео является "странным". Когда при задании фиксированной ширины значение высоты, с учетом получающегося соотношения, будет некорректным и возникнет ошибка примерно с таким сообщением: Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height.
Кроме того, иногда может ухудшиться разрешение (качество) видео. Чтобы избежать такой ошибки, можно, например, использовать такую команду:
ffmpeg -i input.mp4 -vf scale=150:-2 -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M -strict -2 output.mp4
Указание опции -2 в данном случае установить высоту делимой на 2.
Правда, в некоторых случаях может возникнуть ошибка вида Size values less than -1 are not acceptable. Тогда можно использовать следующее:
ffmpeg -i input.mp4 -vf scale="150:trunc(ow/a/2)*2" -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M -strict -2 output.mp4
Аналогично можно задать фиксированную высоту, а ширину, наоборот, определить автоматически. При этом нужно будет использовать что-то вроде scale="trunc(oh*a/2)*2:150".
Как выполнить преобразование размеров видео при помощи ffmpeg и сразу скопировать полученный файл в какую-нибудь папку?
Например, скопировать в защищенную папку /media/sf_Common/:
ffmpeg -i input.mp4 -vf scale=150:-2 -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M -strict -2 output.mp4 && sudo cp output.mp4 /media/sf_Common/output.mp4
Операция копирования выполнится только тогда, если предыдущая команда (до символов "&&") выполнится без ошибок. Может потребоваться ввод пароля.
