В данной статье попробуем «на пальцах» объяснить, что такое FFmpeg для начинающих пользователей Linux (да и Windows тоже). FFmpeg популярный набор программ и библиотек среди multimedia и web разработчиков. На базе FFmpeg сделано множество программ по конвертированию видео из одного формата в другой. Популярность этой программы крайне высока. Почему он так популярен? Для чего его чаще используют? Как установить и как запустить?

Итак, основные фишки FFmpeg, которые могут привлечь внимание неискушенного Linux пользователя, только-только начавшего изучать Ubuntu:

  • FFMpeg — бесплатный.
  • Есть во всех Linux дистрибутивах.
  • Можно просмотреть любой фильм.
  • Работает со всевозможными видеоформатами.
  • Позволяет сконвертировать видео из одного формата в другой.
  • Поддерживает параллельное кодирование на нескольких процессорах.
  • Ускорения кодирования на NVidia картах.
  • Можете использовать FFmpeg в своих программах, а потом продавать их.

FFmpeg доступен на Linux, Windows, Mac Os. И везде работает одинаково. Так что, если вы научились работать с FFmpeg под Windows, то точно так же его надо запускать и в Linux и наоборот.

FFmpeg абсолютно самодостаточен . Для того чтобы посмотреть фильм нет необходимости искать в сети, скачивать и устанавливать кодеки. Достаточно всего лишь одного файла (ffplay.exe), все кодеки содержатся внутри этого файла.

FFmpeg — бесплатный софт (лицензии GPL 2.0 и LGPL 2.1) и вы можете использовать его код в своих проектах, как в коммерческих, так и в свободно-распространяемых.

Как было уже сказано, FFmpeg — это набор программ. Что значит “набор программ”? Нужно все программы качать или можно по отдельности? Что там внутри? На эти вопросы мы сейчас и постараемся ответить.

Но для начала определимся с термином FF mpeg — это сокращенное от F ast F orward Mpeg. Когда говорим о FFmpeg, как о наборе программ, то первые две буквы «F» должны быть большие (FF).

Итак, FFmpeg состоит из следующих инструментов (tools): ffmpeg, ffplay, ffserver, ffprobe (заметьте, все с маленькой буквы). Для Windows это обычные exe файлы. Причем размер у них очень внушительный. Все дело в том, что все видео и аудио кодеки уже находятся внутри них. Если вам нужно посмотреть фильм, то просто скачайте из сети ffplay.exe, больше ничего не потребуется. Никаких инсталляторов, никаких кодеков, права Administrator не нужны. Скачали, разархивировали, можете приступать к просмотру фильма.

FFmpeg в Windows, размер каждого файла 38-39Mb, все кодеки скомпилированы и прилинкованы «внутрь» исполняемого файла.

ffmpeg

С помощью этой программы можно конвертировать видео из одного формата в другой. Склеивать несколько видеороликов в один. Разбирать видео на отдельные кадры (изображения), а потом склеивать обратно. Ускорять/замедлять, масштабировать, добавлять субтитры и несколько звуковых дорожек. И еще 100500 полезных действий.

Список доступных опций этой команды занимает 203 страницы:

Впечатляет, не так ли?

ffplay


Используется для просмотра фильмов. Если вы начинаете знакомство с FFmpeg с просмотра фильмов, то ffplay, то что вам нужно. На начальном этапе весь пакет FFmpeg для начинающих сводится к использованию лишь этой программы.

ffserver


Если вам вдруг захотелось создать свой видео хостинг похожий на YouTube, то используйте ffserver.

ffprobe


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

Помимо четырех программ в пакет FFmpeg входит еще и набор свободно-распространяемых библиотек (из которых вышеприведенные программы и собраны):

  • libavutil — набор вспомогательных функций;
  • libavcodec — аудио/видео кодеки;
  • libavformat — библиотека по работе с контейнерами;
  • libavdevice — работа с устройствами поставляющими медиа контент;
  • libavfilter — различные фильтры;
  • libswscale — библиотека масштабирования, работа с цветовыми пространствами;
  • libswresample — библиотека обработки звука.

В принципе, из-за этих библиотек весь проект FFmpeg и затевался, а программы уже так, бонусом пошли 🙂

Используя эти библиотеки вы можете создавать свои приложения по работе с мультимедиа контентом и даже потом продавать их. Написать свой видеоплеер или видеоконвертер не составит труда. В сети полно руководств и инструкций по использованию библиотек FFmpeg.

История

История развития FFmpeg так же богата, как и его содержимое. Начавшись в 2000 году она претерпела сильное потрясение в 2011, когда часть разработчиков решила создать свою собственную библиотеку по работе с медиа контентом, назвали они ее — Libav. Свое желание уйти из проекта они объяснили недовольством организацией проекта FFmpeg, где по сути вся власть находилась в руках одного человека и все решения принимал только он сам.

Сейчас Libav идет своим путем и никого не слушает. Код обновляется не так часто, как FFmpeg. Каждое обновление тщательно проверяется.

FFmpeg в долгу не остался и исправно, каждые два дня, забирает к себе в норку изменения в коде, сделанные командой Libav:-)

В настоящее время FFmpeg продолжает активно развиваться, как доказательство скриншот репозитария исходных кодов:

Установка

Пакет FFmpeg настолько популярен, что включен во многие дистрибутивы Linux по умолчанию. Если вы по какой-то причине не установили его сразу, то это можно сделать потом с помощью менеджера пакетов. Установка FFmpeg для начинающих не должна вызвать особых проблем. В зависимости от дистрибутива Linux, нужно будет выполнить ряд стандартных команд.

Sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install ffmpeg

Yum -y install ffmpeg ffmpeg-devel

openSuSe

Zypper install ffmpeg

Самые свежие версии FFmpeg для Windows можно скачать с:

https://ffmpeg.zeranoe.com/builds/

Два типа FFmpeg

Есть два вида в которых FFmpeg приходит на ваш компьютер:

1) static-build — в этом случае все кодеки, фильтры и утилиты вкомпилированы «внутрь» ffmpeg.exe (ffprobe.exe, ffplay.exe) и вам достаточно скачать только один из этих файлов, чтобы начать смотреть киношку (ffplay.exe). В этом случае размер исполняемого модуля сильно раздувается (до 39Mb). Зато очень удобно.

2) shared-build — здесь кодеки, фильтры и другие вспомогательные программки являются самостоятельными отдельными файлами, которые FFmpeg находит и по мере надобности подгружает. В этом случае размер исполняемого модуля всего 190Kb.

Если вы устанавливаете FFmpeg в Linux, то с вероятностью 99.9% будет установлен shared-build.

Лично я, предпочитаю static-build (не надо думать о других библиотеках). Чтобы получить static-build под Linux нужно собрать FFmpeg самому из исходников. Для начинающих пользователей Linux это может оказаться сложно.

А как смотреть кино?

Все понятно, но как фильмы-то смотреть? Как говорилось выше, ffplay (ffplay.exe — под Windows) является консольной программой, то есть у нее нет графического интерфейса. Для просмотра видео необходимо выполнить в командной строке:

Ffmpeg.exe film.avi

после чего сразу начинает воспроизводиться фильм:

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

Если вы чувствуете себя неуверенно при работе с командной строкой Windows, то можете воспользоваться следующим способом. Захватите фильм мышкой и перетащите его на ffplay.exe, кино сразу же станет воспроизводиться.

Контроль за воспроизведением (краткий список команд):

q, ESC — выход,
f — полный экран (двойной клик левой кнопкой мыши),
p — поставить на паузу,
m — звук вкл/выкл,
9, 0 — звук прибавить/убавить,
t — переключение субтитров,
c — cycle program
s — покадровое перемещение по фильму,
стрелка влево/вправо — перемещение на 10 сек назад/вперед,
стрелка вниз/вверх — перемещение на 1 мин назад/вперед,
page down/page up — перемещение на 10 мин назад/вперед.

Графический интерфейс проигрывателя ffplay выглядит довольно аскетичным, вернее сказать его вообще нет. Отсутствуют привычные ползунки, кнопочки, менюшки присущие media player’ам с графическим интерфейсом. При работе с ffplay вы видите только сам фильм и какие-то непонятные цифры и слова мелькающие в окне терминала, как в фильме «Матрица». На самом деле управлять фильмом с клавиатуры просто и понятно, через несколько просмотров пальцы сами запомнят какие кнопки нужно нажимать.

Несколько примеров запуска ffplay с различными опциями:

Уменьшить изображение в 4 раза по ширине

Ffplay -vf scale=iw/4:-1 video.avi

Почистить видео от шума

Ffplay -vf hqdn3d=4:3:6:4.5 video.avi

Ускорение в 2 раза

Ffplay -vf setpts=0.5*PTS video.avi

А как перекодировать?

Перевести mpg в avi

Ffmpeg -i video.mpg video.avi

Извлечь звук из видео и записать в формате MP3

Ffmpeg -i video.mp4 -vn -ab 128 audio.mp3

Склеить звук и видео

Ffmpeg -i audio.wav -i video.avi final_video.mpg

Извлечь видеодорожку (без звука)

Ffmpeg -i video.mp4 -an video_bez_zvuka.mp4

Изменить размер видео

Ffmpeg -i video.mp4 -s 640x480 -c:a copy video640480.mp4

Выбросить первые 45 секунд видео и оставить участок длительностью 40 секунд

Перекодировать WAV в MP3

Ffmpeg -i audio.wav -b:a 192k audio.mp3

Разложить видео на кадры (изображения)

Ffmpeg -i video.webm thumb%04d.jpg

Сделать видео из набора изображений

Ffmpeg -i frame-%03d.png video.avi

Заключение

Данная статья имеет целью познакомить читателя с мощнейшим набором программ FFmpeg. Дается краткое описание пакета FFmpeg. Приводятся примеры его использования для просмотра видео и для обработки (ковертиования) аудио и видео материалов.

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

Задачей данной статьи было показать, что FFmpeg для начинающих пользователей Linux должен быть незаменимым инструментом при работе с media контентом. Не нужно бояться отсутствия GUI. Работа с аудио и видео из консоли тоже может быть очень эффективной.

P.S. Так как FFmpeg приходится пользоваться часто, то я решил собрать все популярные приемчики использования в одной книге .

В прошлом посте я рассказал как установить .

В данном посте я рассмотрю базовые команды, которые существенно облегчат работу с FFMpeg. Огромное количество информации содержится в мануалах, они как известно рулез, так что если какая-то информация оказалась за пределами поста, «man ffmpeg» вам в помощь.

Для понимания, более простых конструкций, например такой:

Ffmpeg -ss 5 -i a.mp4 -aspect 4:3 -f image2 -r 1 -vframes 300 a%2d.jpg

чуть ниже я перечислю наиболее часто используемые опции.

Опции ffmpeg

Рассмотрим некоторые полезные опции (в скобках примеры). Если какие-то из опций не будут указаны, то FFmpeg подставит их из значений по умолчанию:

-i — задает имя исходного (входного) файла.
-threads — числовое значение, определяет количество ядер процессора. Что, естественно, отражается на скорости кодирования и операций над файлами. Число 0 устанавливает автоматическое определение доступного числа ядер (-threads 2 ).
-t — задает длительность кодируемого видео в целых секундах или же в формате чч:мм:сс.
-ss — указывает позицию в видеофайле с которой будет начинаться кодирование. Формат в целых секундах или чч:мм:сс.
-fs — числовое значение в байтах, килобайтах (k), мегабайтах (M). Регистр приставки важен. Ограничивает размер конечного файла. Полезно для экспериментов над небольшим кусочком видеофайла, чтобы не кодировать весь файл (-fs 5M ).
-y — эта опция перезаписывает уже существующие файлы без запроса на подтверждение.
Видео опции:
-vcodec — видеокодек, которым будет осуществляться кодирование видео (-vcodec mpeg4 ).
-vpre — выбираем предустановку для видеокодека. Сначала FFmpeg ищет файлы предустановок в ~/.ffmpeg, затем в /usr/share/ffmpeg или /usr/local/share/ffmpeg, в зависимости от пути установки. Посмотреть самим, какие присутствуют файлы предустановок, можно по этим же путям.
-f — force, указываем принудительно формат конечного файла (-f avi ).
-b — битрейт видеопотока. По умолчанию: 200kb/s (-b 1500 ).
-bt — толерантность битрейта. По умолчанию: 4000k. При двухпроходном кодировании указывает как далеко в первом проходе можно отклониться от указанного среднего битрейта. Значение не связано с минимальным/максимальным битрейтом. Слишком сильное снижение этого параметра оказывает негативное влияние на качество.
-r — количество кадров в секунду. По умолчанию: 25 (-r 15 ).
-s — размер фрейма, то есть разрешение выходного видеофайла. По умолчанию определяется размером файла-источника. Может быть задано буквенными сокращениями, например svga означает размер 800×600. Просмотреть все доступные сокращения можно в man ffmpeg . (-s 640×480 или -s vga ).
-aspect — числовые значения, определяет соотношение сторон выходного файла (-aspect 4:3 или -aspect 1.3333 ).
-croptop
-cropbottom
-cropleft
-cropright — обрезка кадров сверху, снизу, слева, справа. Значения указываются в пикселях. Может использоваться, например, для удаления черных полос (-croptop 15 ). В некоторых версиях ffmpeg данные опции могут быть удалены и вместо них используется опция -vf crop=width:height:x:y . Подробнее о ней в соответствующем разделе ниже.
-pass — количество проходов при кодировании, 1 или 2 (-pass 2 ).
-g — размер группы кадров, после которой следует ключевой кадр. Например -g 300 устанавливает по одному ключевому кадру каждые 10 секунд, при скорости исходного видеофайла 29.97fps. 30 кадров в секунду * на 10 секунд = значение опции 300 (примерное значение для рипа DVD-файла). Чем меньше битрейт и количество кадров в секунду, тем меньше должно быть это значение.
-deinterlace — удаление «гребенки».
Аудио опции:
-ar — устанавливает частоту дискретизации звука. По умолчанию: 44100Гц (-ar 22050 ).
-ab — битрейт звуковой дорожки. По умолчанию: 64kb (-ab 256k ).
-ac — число каналов звуковой дорожки. По умолчанию, для входящих потоков это значение равно 1, для исходящих равно числу каналов исходного файла. Другими словами, если вы делаете захват звука, то число каналов по умолчанию 1, а если берете звук из видеофайла, например, то число каналов по умолчанию будет равно исходнику (-ac 2 ).
-an — кодирование видео без звуковой дорожки.
-acodec — аудиокодек, которым будет осуществляться кодирование звука (-acodec flac ).
-apre — набор предустановок для аудиокодека.

Наиболее часто используемые конструкции:
1. Получение информации о видеофайле

Ffmpeg -i video.avi

2. Превратить набор картинок в видео

Ffmpeg -f image2 -i image%d.jpg video.mpg

Эта команда преобразует все картинки из текущей директории (названные image1.jpg, image2.jpg и т.д.) в видеофайл video.mpg


Ffmpeg -r 12 -y -i "image_%010d.png" output.mpg


здесь задаётся frame rate (12) для видео, формат «image_%010d.png» означает, что картинки будут искаться в виде image_0000000001.png, image_0000000002.png и тд, то есть, в формате printf)

3. Порезать видео на картинки

Ffmpeg -i video.mpg image%d.jpg

Эта команда создаст файлы image1.jpg, image2.jpg и т.д., поддерживаются так же форматы PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.
4. Конвертировать видео в формат iPod/iPhone

Ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4

Пояснения:

  • Источник: source_video.avi
  • Аудио кодек: aac
  • Битрейт аудио: 128kb/s
  • Видео кодек: mpeg4
  • Битрейт видео: 1200kb/s
  • Размер видео: 320 на 180 пикселей
  • Полученное видео: final_video.mp4

5. Конвертировать видео в формат PSP

Ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4

От переводчика :
Многие знают, что ffmpeg - это сила, но не все знают, какая именно. Он многогранен и безграничен, а его man объёмен и местами малопонятен, лишь немногие постигли дао профессиональной работы с ним. И тем не менее, этот инструмент может быть полезен почти всем, кто хоть иногда работает с видео и звуком, даже на бытовом уровне. О некоторых полезных консольных командах ffmpeg и пойдёт речь в статье. В некоторых местах я взял на себя смелость вставить ссылки на поясняющие статьи.

Ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg
Формат PAL :

Ffmpeg -i video_origine.avi -target pal-svcd video_finale.mpg

18. Сжать.avi в VCD mpeg2
Формат NTSC:

Ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
Формат PAL:

Ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg

19. Многопроходное кодирование с помощью ffmpeg
ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
Примечание переводчика :
Предлагаю в комментариях привести и другие полезные команды ffmpeg, их ведь гораздо больше, чем 19. ;)

Это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить кучу времени.

Описание

Не однажды любой сталкивался с ситуацией, когда надо было:

  • разрезать видео на части или наоборот, склеить из двух;
  • вырезать звук из клипа, заменить звуковую дорожку в фильме (выкинуть бубляж, вставить оригинал);
  • наложить субтитры;
  • обрезать по кадру (crop);
  • сконвертировать для iPhone/PSP/ещёчо;
  • и прочее подобное.

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

А ещё некоторые довольно известные видео-редакторы являются по сути лишь графической надстройкой поверх FFmpeg, вот так-то. Но никто не говорит, что это плохо, например XviD4PSP - прекрасный конвертер. Просто зачем использовать тяжёлый GUI, когда всё то же самое можно делать изящно и быстро.

Некоторые операции над видео выполняются без перекодирования ( -vcodec copy -acodec copy ), некоторые требуют перекодирования (не вникая в детали, можно ставить в таких случаях опцию -crf 18 ).

Получение информации по файлу

Самая основная команда, будет нужна как предваряющая для многих других.

Выполняется очень просто:

ffprobe.exe 1 .mp4

Результат будет примерно такой:

Среди кучи инфы можно найти, что видео идёт две минуты ( Duration: 00:02:00.07 ) и в контейнере две дорожки:

  1. Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1389 kb/s, 29.97 fps
  2. Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s

Вырезать фрагмент видео

Эта команда вырежет из файла 1.mp4 начиная с 00:03:05 видеофрагмент продолжительностью 66 секунд ( 00:01:06 ) и сохранит его в файл под именем cut.mp4 .

Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками

Смотрим информацию по файлу:

ffprobe.exe 1 .mp4

Помимо прочей информации видим, например, такое:

Duration: 01:52 :52.80 , start: 0.000000 , bitrate: 2768 kb/ s Stream #0:0: Video: mpeg4 (XVID / 0x44495658), yuv420p, 704x384 Stream #0:1: Audio: ac3 ( / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s Stream #0:2: Audio: ac3 ( / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s

ffmpeg -i 1 .avi -map 0 :0 -map 0 :2 -ss 01:37 :34 -t 63 -vcodec copy -acodec copy cut.avi

Тут есть нюанс. Если дорожка в AC3, то изломается CodecID (был раньше такой косяк контейнера AVI, но возможно его исправили), и звук играться не будет. Однако, можно сложить всё в MKV:

ffmpeg -fflags genpts -i 1 .avi -map 0 :0 -map 0 :2 -ss 01:37 :34 -t 63 -vcodec copy -acodec copy cut.mkv

Вырезать субтитры из контейнера

Сначала смотрим информацию по файлу (как в примере выше), определяем номер дорожки и:

ffmpeg -i 1 .mkv -map 0 :2 1 .ass

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

Поставить на каждый кадр ватермарку

Например, вы записывали летсплей, но в углу экрана палится ваш ник и надо закрыть его чёрным прямоугольником. Или другая ситуация: хочется закопирайтить что-то и налепить в углу какой-нибудь свой логотип.

Делается это так:

ffmpeg.exe -i 1 .mp4 -vf "movie=logo.png ; overlay=16:16" -crf 18 2 .mkv

Тут необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция -crf 18 . Ватермарка лежит в том же каталоге под именем logo.png . Параметр 16:16 - координаты позиционирования верхнего левого угла ватермарки.

Кодирование видео

В основном, с целью уменьшить размер файла. Например, видеозапись с цифровика или захваченное видео Fraps.

Я видел команды на несколько строк, где расписывались битрейты, квантификаторы, фигнификаторы и прочий хардкор, но я же в этом ничего не понимаю, хотелось бы что-то попроще. И оно такое есть, проще некуда:

ffmpeg.exe -i 1 .avi -crf 18 out.mp4

Параметр CRF является некоторым уровнем качества и принимает значения от 0 до 51, где:

  • 0 - наилучшее качество;
  • 51 - наихудшее качество. Если выбрать больше 51, например 54 или 9000 - будет браться всё равно 51.

А теперь порядок действий при установке ffmpeg на Denwer :

  • Создать папку ffmpeg в директории /usr/bin .
  • Скопировать в созданную папку следующие файлы: ffmpeg.exe , SDL.dll , pthreadGC2.dll .
  • Скопировать библиотеку php_ffmpeg.dll в директорию /usr/local/php5/ext .
  • Все остальные файлы скопировать в директорию WINDOWS/system32 .
  • Открыть файл /usr/local/php5/php.ini .
  • Найти строку: "extension=php_bz2.dll ".
  • Сразу за найденной строкой добавить строку: "extension=php_ffmpeg.dll ".
  • Сохранить и закрыть php.ini .
  • Перезапустить сервер.

Всё! Установка ffmpeg на Denwer завершена! Однако, необходимо убедиться в этом. Для этого напишите такой скрипт:

if (extension_loaded("ffmpeg")) echo "Всё работает!";
else echo "Увы, модуль не подключён"; ?>

Запустите этот скрипт, и если вдруг у Вас вывелось "Увы, модуль не подключён ", то внимательно просмотрите: точно ли всё по пунктам Вы сделали. Каждый шаг имеет огромное значение. Также будьте внимательны данная версия ffmpeg работает под PHP5.3 . Не факт, что она запустится под другой версией PHP .