Digital skills, Саморазвитие

Сжимаем всё и сразу: видео

Время прочтения: 7 мин.

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

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

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

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

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

FFMpeg

FFMpeg для Windows можно скачать по ссылкам https://FFMpeg.zeranoe. com/builds/win32/static/ или https://FFMpeg.zeranoe. com/builds/win64/static/ (в зависимости от версии используемой вами операционной системы, 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 будут лежать все преобразованные файлы.

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

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

Советуем почитать