Найти тему
Easy Linux - о Linux просто

Знакомство с утилитой ffmpeg в Linux. Кодеки. Медиаконтейнеры. Форматы

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

Что такое видео?

История видео насчитывает уже больше сотни лет, но основные принципы остаются неизменны и по сей день. Если показывать меняющиеся статические картинки, то ввиду особенностей работы нашего мозга, мы будем видеть не отдельные картинки, а плавный полноценный видеоряд. Минимальная частота смены картинок для комфортного «обмана» мозга составляет 24 кадра в секунду. Этого вполне достаточно, чтобы заставить мозг думать что это что-то единое и непрерывное.

Кодеки

Само собой было бы глупо хранить всю последовательность картинок в чистом виде, ведь разница между некоторыми картинками может быть минимальна. Например, если показывать летящий в небе самолет, то от картинки к картинке будет изменяться положение самолета, а небо будет изменяться минимально. Кодек - это программа или аппаратное средство, которое анализирует видеоинформацию и на основе этого анализа уменьшает объем хранимых данных. Кодеки могут сжимать как видео данные, так и аудио. При воспроизведении видеофайла происходит обратный процесс, и мы видим исходное изображение на экране. Разные кодеки используют разные механизмы для достижения результата, что влияет на итоговый вес информации, потери качества, ресурсы необходимые для преобразования и т.д. Ну и вполне логично то, что, если на вашем устройстве не установлен кодек, которым был закодирован видеопоток, то вы не сможете его декодировать, а значит не сможете его просмотреть. В качестве примеров видеокодеков можно привести следующие: DivX, MPEG-1 / 2 / 3 / 4, H.264, H.265, VP9 и т.д. В качестве примеров аудиокодеков: ACC, OGG, FLAC и т.д. Определить каким кодеком закодирован видеопоток можно либо через специальные программы, либо посмотреть в свойствах файла.

Контейнеры

Окей, с кодеками вроде разобрались. Но есть еще одна вещь, о которой важно знать - это контейнеры или медиаконтейнеры. Дело в том, что помимо видеоинформации в файле может храниться еще много чего. Например, аудиодорожки или даже много аудиодорожек, различная метаинформация, метки, субтитры, шрифты и тд. Если кодек определяет алгоритм обработки видеопотока в файле, то задача контейнера организовать хранение всего этого барахла в файле. Определить контейнер легко - это расширение файла. Например, move.avi. Контейнер в данном случае будет – avi. Самые популярные медиаконтейнеры: AVI, 3GP, MP4, MOV, M4V и т.д. В теории кодек и контейнер никак не связаны, вы замечательно можете закодировать видеопоток кодеком H.265 и поместить в любой контейнер какой вам нравится. Но на практике есть некоторые ограничения и зависимости. Например, в контейнере Real Media могут храниться исключительно потоки в формате Real Video и Real Audio.

ffmpeg

Утилита, как я уже говорил, очень мощная и довольно надежная. Знание её работы поможет тебе правильно ее применять, а правильное ее применение значительно повысит твой скилл и конкурентноспособность в целом. К слову утилита эта есть и на Windows и на Mac.

Для пользователей Manjaro Linux утилита уже идет в комплекте с системой. Если у тебя, например, Linux Mint, то тебе нужно ее установить.

apt install ffmpeg

Итак чтобы посмотреть информацию о видеофайле достаточно ввести ключ –i и указать имя файла:

ffmpeg –i имя_фалйа

Мы увидим довольно много всего, но не стоит пугаться. Большая часть вывода - это так называемый «банер» – информация о самой программе ffmpeg, которая будет показываться всегда. Её можно отключить введя -hide_banner:

ffmpeg –i имя_фалйа -hide_banner

Здесь довольно много интересной информации, среди которой есть и информация о кодеке видеопотока – h264. Причем указаны некоторые настройки, например, мы можем понять, что была применена конфигурация высокого качества при сжатии (high). Мы видим информацию об аудиокодеке (acc), разрешение видеопотока, количество кадров и т.д.

Идем дальше. Давайте попробуем изменить контейнер видеофайла. Делается это следующей командой:

ffmpeg -i video.mp4 video.avi

В данном случае мы поменяли исходный контейнер mp4 на контейнер avi. Кстати, чтобы увидеть все поддерживаемые контейнеры достаточно ввести:

fmpeg -formats

Если указать на выходе в качестве контейнера формат звука, то утилита откинет видеопоток и запишет только звук:

ffmpeg -i video.mp4 video.mp3

А если наоборот нужно удалить звук из видео, то нужно добавить флаг –an:

ffmpeg -i input.mp4 -an output.mp4

Если тебе нужно перекодировать видеоинформацию или аудиопоток другим кодеком, то это тоже не проблема. Нужно иметь ввиду, что каждый кодек может иметь индивидуальные настройки и команды, и наилучший способ их узнать - это зайти на официальный сайт ffmpeg, где есть подробное описание и примеры. Давайте перекодируем видеопоток из h264 в h265:

ffmpeg -i video.mp4 -c:v libx265 video.mp4

Если необходимо мы можем изменить и контейнер:

ffmpeg -i video.mp4 -c:v libx265 video.mkv

В данном случае будет произведено кодирование с настройками по дефолту, но мы можем их изменить, например, указать качество командой crf:

ffmpeg -i video.mp4 -c:v libx265 -crf 26 video.mkv

Диапазон шкалы CRF: 0–51, где 0 — без потерь, 51 - соответственно ужаснейшее качество. Помимо качеств можно еще указать пресеты и много чего еще. Если тебе нужно получить максимальное качество при минимальном весе файла, тут не обойтись без часов экспериментов и проб.

На самом деле ffmpeg может делать еще огромное количество вещей. Можно обрезать, склеивать, вытаскивать скриншоты, ускорять, замедлять, менять разрешение соотношение сторон, менять частоты кадров, менять битрейт, добавлять постер, разрезать на несколько частей и много-много всего. Для общего ознакомления думаю достаточно приведенных примеров.

Итог

Данный материал дает только общее представление о столь мощной утилите как ffmpeg. Чтобы изучить её досконально нужно потратить довольно много времени и сил. Но есть такое замечательно правило 20/80, которое означает, что достаточно знать 20% функционала какого-либо инструмента, чтобы выполнять 80% от всех возможных решаемых данным инструментом задач. Здесь это очень актуально - достаточно запомнить лишь несколько команд для базовых ситуаций. А если добавить небольшое знание какого-нибудь питона, то можно сделать что-то забавное. Например, программу, которая будет шариться по файловой помойке, выискивать видео и сжимать их. Мне таким образом удалось из почти 1700 ГБ файлов получить 970 ГБ без какой-либо видимой потери качества. Кстати, кому интересен скриптик оставлю ссылочку =)

https://vk.com/easy_linux?w=wall-203080379_557

До встречи авантюрист.

#easy_linux #linux #ffmpeg #видео #конвертор #аудио #кодеки #контейнеры #медиаконтейнеры

Оригинал материала: https://vk.com/@easy_linux-znakomstvo-s-utilitoi-ffmpeg-kodeki-mediakonteinery-formaty