NewTechAudit
75

Как сжать видео с использованием FFMpeg?

В закладки

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

К счастью, для использования изображения в качестве доказательства идеальное качество и высокое разрешение часто не нужны, достаточно иметь возможность прочесть необходимый текст или рассмотреть внешность и действия человека. Поэтому размер файла можно сократить, уменьшив размер картинки, усилив сжатие изображения, а в видео — ещё и уменьшив количество кадров в секунду.

Для компрессии можно использовать различное программное обеспечение:

  • Профессиональные пакеты для работы с графикой и видео, например, Adobe Photoshop, Adobe Premier, Vegas (бывший Sony Vegas). Для быстрого сжатия пары десятков фотографий и видеороликов малопригодны, т.к. имеют большой размер, высокие системные требования, сложны в использовании и ОЧЕНЬ дороги.
  • Бесплатное ПО, например, IrfanView, FastStone или VirtualDub. Как правило, менее требовательны к ресурсам и просты в использовании, но имеют свои недостатки в виде неоднозначных (особенно для коммерческого использования) лицензий, отсутствия некоторых необходимых функций, закрытого проприетарного кода и т.п.
  • Бесплатное и свободное ПО, имеющее богатый функционал, открытый, модифицируемый и верифицируемый код и гибкий и мощный программный интерфейс. Звучит как сказка, но существует в реальности в виде двух пакетов — FFMpeg для обработки видео и ImageMagick для работы с изображениями.

Рассмотрим эти инструменты подробнее и начнём с пакета обработки видео

FFMpeg

Скачиваем FFMpeg для Windows (будем работать с этой ОС) (в зависимости от версии используемой вами операционной системы, 32- или 64-битной). В открывшейся в браузере папке найдите последний по времени ZIP-архив и скачайте его на свой компьютер.

Для дальнейшей работы нам потребуется файл ffmpeg.exe, который находится в скачанном архиве в папке BIN.

1. Создайте пустую папку, в которой в дальнейшем будете производить обработку видеофайлов. Для удобства назовём эту папку WORK.
2. В папке WORK создайте две папки IN и OUT.
3. Распакуйте файл ffmpeg.exe из папки BIN скачанного архива в папку WORK.
4. Скопируйте в папку WORK\IN видеофайл, который вы хотите сжать. Для удобства условимся, что этот видеофайл называется video.avi.
5.В папке WORK создайте текстовый файл convert.bat. В текстовом редакторе запишите в него команду:

ffmpeg.exe -y -i in\video.avi -vcodec mpeg4 -q:v 10 -r:v 10 out\video.avi

Сохраните и закройте файл convert.bat, затем запустите его. На экране появится окно, демонстрирующее ход работы программы ffmpeg.exe, производящей обработку видеофайла:

В зависимости от производительности вашего компьютера скорость кодирования может составить 10% — 50% от продолжительности видеозаписи.

После завершения работы конвертора окно исчезнет, а в папке OUT будет находиться сконвертированный файл video.avi. В зависимости от размеров, качества и параметров сжатия исходного файла, размер сконвертированного файла может быть от 2 до 10 раз меньше исходного. А может и не быть, или быть даже немного больше, если исходный файл уже был сильно и качественно сжат — но такие случаи встречаются не очень часто.

Рассмотрим подробнее параметры команды, которую мы записали в файле convert.bat.

ffmpeg.exe — Собственно, имя самого запускаемого конвертора

-y — Ключ, который разрешает FFMpeg перезаписать сжатый файл в папке OUT, если он там уже есть с таким же именем

-i — Ключ, который говорит, что следующий элемент команды будет именем исходного файла

in\video.avi — Имя исходного файла. В данном случае говорит о том, что файл video.avi находится в папке IN в той же папке, что и исполняемый файл ffmpeg.exe. При необходимости можно записать полный путь к файлу, например c:\work\in\video.avi. Помните, что если в имени файла или папки есть пробелы, то всю строчку с путём и именем исходного файла нужно заключить в кавычки, например: «c:\Мои документы\in\Мой видеофайл.avi»

-vcodec — Ключ, который говорит, что следующий элемент команды будет названием кодека, т.е. условного имени программной библиотеки, реализующей определённый стандарт сжатия видеопотока

mpeg4 — Название кодека, которое следует за ключом –vcodec. В данном случае используется кодек, реализующий стандарт сжатия видео MPEG-4 Part 2. Для эффективной компрессии видео, как правило, применяются несколько кодеков, реализующих различные стандарты обработки: mpeg4, h263, h264 и wmv3. Не будем подробно описывать каждый из них, достаточно сказать, что для нашей задачи кодек mpeg4 представляет собой наиболее оптимальный вариант с точки зрения соотношения скорости работы, степени сжатия и конечного качества изображения (но вы можете попробовать изменить это значение и посмотреть, что у вас получится)

-q:v — Ключ, который говорит о том, что следующий элемент команды будет значением уровня качества изображения

10 — Уровень качества изображения сжатого видеофайла, которое следует за ключом -q:v. 1 — максимально возможное для исходного видеофайла качество, далее чем число больше, тем качество хуже (но при этом размер конечного видеофайла — меньше). При выборе качества нужно находить разумный компромисс между желанием получить изображение идеального качества, без «квадратиков» и т.п., и необходимостью как можно сильнее уменьшить исходный файл. Экспериментально установлено, что 10 – оптимальное для нашей задачи соотношение качества и размера (но вы также можете попробовать изменить это значение и посмотреть, что у вас получится)

-r:v — Ключ, который говорит, что следующий элемент команды будет числом кадров в секунду в сжатом видео

10 — Число кадров в секунду в сжатом видео. Видеозапись, полученная из системы видеонаблюдения или снятая мобильным телефоном, стандартно имеет 24-30 кадров в секунду. Для просмотра и идентификации событий, происходивших на проверяемом объекте, как правило, достаточно 5-10 кадров в секунду, что позволяет при конвертации сразу сжать видеофайл в 2-3 раза, с тем же качеством изображения

out\video.avi — И последний элемент команды — всегда имя сжатого файла. Для него действуют те же правила записи, что и для исходного

Ключей, опций и прочих возможностей у программы ffmpeg.exe огромное количество. Комбинируя их различными способами, можно реализовать практически любой возможный вариант обработки исходного видеофайла. Более подробную справку по ключам и примеры команд вы можете посмотреть в документации.

Меняя в файле convert.bat имя обрабатываемого файла, можно использовать его для сжатия разных файлов. Можно скопировать в папку IN несколько файлов и в файле convert.bat сделать несколько строк с именами этих файлов, чтобы они были сжаты одним запуском convert.bat. Но хорошо, если файлов 2-3, а если 20-30? Или 200-300? И все они имеют разные названия?

Скопировать и исправить такое количество команд вручную, видимо, будет довольно утомительно. В этом случае нам поможет автоматизация с использованием встроенного в Windows языка выполнения скриптов

JScript

В Windows существует встроенный механизм (так называемый Windows Script Host, или WSH), который позволяет запускать написанные в виде простого текстового файла программные скрипты на языках JScript и VBScript. Эти языки довольно похожи по своим возможностям и используют одни и те же функции WSH, которые, в отличии от bat-файлов, позволяют пользоваться всем тем, что есть у настоящих языков программирования — переменными, циклами, условиями, работой со строками, файлами и т.д.

Для автоматизации процесса обработки всех исходных видеофайлов, которые находятся в папке IN, в папке WORK создайте текстовый файл convert.js. В текстовом редакторе вставьте в него следующий программный код:

fso=new ActiveXObject("Scripting.FileSystemObject"); //создаём объект fso для работы с файлами WshShell=WScript.CreateObject("WScript.Shell"); //создаём объект для работы с окружением WorkScriptPath=fso.GetParentFolderName(WScript.ScriptFullName); //получаем имя каталога скрипта //Получаем список файлов в каталоге IN fin=fso.GetFolder("in\\"); //создаем объект f со свойствами каталога IN fc=new Enumerator(fin.files); //создаем объект fc, содержащий список файлов в каталоге IN for (; !fc.atEnd()==true; fc.moveNext()) //двигаемся по этому списку до последней записи { fn=fso.GetFileName(fc.item()); //извлекаем имя исходного файла без пути //заменяем расширение конечного файла на AVI if (fn.substr(fn.length-4, 1)==".") fn2=fn.substr(0, fn.length-3)+"avi" else fn2=fn.substr(0, fn.length-4)+"avi" //формируем строку команды конвертации очередного файла //(можете попробовать поменять какие-нибудь параметры строки команды FFMpeg) command_string=WorkScriptPath+ "\\ffmpeg.exe -y -i "+"\""+WorkScriptPath+"\\in\\"+fn+"\""+ " -vcodec mpeg4 -q:v 10 -r:v 10 "+ "\""+WorkScriptPath+"\\out\\"+fn2+"\""; result=WshShell.Run(command_string, 1, true); //выполняем команду конвертации }

Разбирать этот скрипт в рамках данной статьи мы не будем – основные комментарии по его работе есть в коде, а те, кто заинтересовался вопросом программирования на JScript, могут обратиться к ресурсам в интернете.

Итак, сохраните файл, закройте редактор. Запустите файл convert.js на исполнение. Если всё сделано правильно, то на экране будут друг за другом последовательно появляться и исчезать окна с процессами преобразования программой ffmpeg.exe исходных файлов из папки IN. Когда последнее окно исчезнет, то в папке OUT будут лежать все преобразованные файлы.

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

Продолжение следует…

{ "author_name": "NewTechAudit", "author_type": "editor", "tags": [], "comments": 0, "likes": 2, "favorites": 1, "is_advertisement": false, "subsite_label": "newtechaudit", "id": 111416, "is_wide": false, "is_ugc": false, "date": "Tue, 10 Mar 2020 11:13:07 +0300", "is_special": false }
0
Комментариев нет
Популярные
По порядку

Прямой эфир