Фотогалереи

Услуги

Помощь при использовании сайта

Кодируем видео в Linux. FFmpeg.

В среде GNU/Linux существует масса способов для кодирования видео. Самые известные из них это конечно же Mencoder (часть проекта Mplayer) и Kdenlive. Я не буду останавливаться на обзоре этих пакетов, так как kdenlive требует установки половины KDE, что для меня, пользователя собравшего свое "DE" на базе WM Openbox будет выглядеть как минимум нецелесообразно. Mencoder же в свою очередь не является тем инструментом с которым легко работать напрямую через командную строку. Синтаксис достаточно сложен и не запоминается легко если им не пользоваться каждый день. А если учесть то, что он использует те же самые библиотеки FFmpeg, только собранные статически с Mplayer смысл теряется совсем. В Mplayer2 из кода был выброшен Mencoder, что дало возможность не использовать в системе несколько сущностей используемых для одних и тех же целей. Покончим наконец с вступлением в котором я обычно пытаюсь выложить некоторое количество информации напрямую затрагивающую тему статьи, которая в свою очередь иногда тоже бывает полезна.

Итак FFmpeg. FFmpeg - это набор библиотек с открытым исходным кодом который можно использовать в различных системах, другими словами пакет является кросплатформенным. В данном случае я рассмотрю примеры простейшего кодирования видео с изменением кодеков, битрейта и разрешения исходных мультимедиа данных в GNU/Linux. Хочу обратить внимание на то, что в моем случае простейшее означает достижение целей с помощью максимально "прозрачных" действий и наименьшего количества лишних сущностей, а не с помощью нажатия одной большой иконки "Кодировать хорошо" которое обычно споровождается установкой большого числа новых пакетов.

Для примера перекодируем некоторое видео в нужный нам контейнер с использованием тех или иных аудио/видео кодеков.

ffmpeg -i input.avi -vcodec libx264 -vb 2000K -s 1024x600 -acodec libmp3lame -ab 128K -ac 2 /Video2/Downloads/output.mkv

В данном примере мы перекодируем видео из контейнера AVI со звуком AC-3 и видео пожатым кодеком XVID в контейнер .mkv с использованием кодека H264 и звуком MP3.

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

  • "-i" Задает входящий файл
  • "-vcodec" Задает используемый видеокодек.

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

ffmpeg -codecs |grep EV

В процессе я пришел к тому, что предпочтительным выбором среди видеокодеков будут H264 и XVID. H264 имеет на мой взгляд лучшее соотношение качества и размера файла, но использовать его лучше тогда, когда доступно его аппаратное декодирование. В GNU/Linux это видеокарты nVidia с поддержкой VDPAU. (8 семейство и выше). XVID я использую например для нетбука с Intel GMA, поскольку аппаратное декодирование H264 на Intel GMA невозможна и вся работа по декодированию ложится на CPU загружая его в среднем на 25 - 40% в зависимости от битрейта видеопотока. XVID же предлагает сходное качество при примерно тех же параметрах видео, но загружая процессор на порядок меньше.

    "-vb" Задает битрейт видеопотока. (Например 2000K == 2M)

  • "-s" Задает разрешение получаемого видео
  • "-acodec" По аналогии задает нужный кодек для аудиопотока.
  • "-ab" Задает битрейт аудиопотока
  • "-ac" Нужен не всегда и задает количество каналов.

Например при кодировании звука из AC-3 с потоком 5.1 в mp3 нужно будет будет указать эту опцию, так как mp3 не умеет звука отличного от стерео.

Можно легко вырезать кусок видео (без энкодинга) с помощью ffmpeg. Делается так:

ffmpeg -i somefile.mp4 -acodec copy -vcodec copy -ss 00:05:00 -to 00:08:32 newfile.mp4

Захватываем оба потока и звук и видео с 5 минуты до 8:32 и сохраняем это в указанный файл.

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

4.25
4 голосов
Ваша оценка: Нет


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
Аватар пользователя anonymous

Не раскрыта тема параметров x264-кодека trellis, subq, 8x8dtc, me, которые есть в mencoder, но которые не понятно как найти в ffmpeg. Поэтому приходится пока что пользоваться mencoder'ом. Тем более, что он умеет при кодировании объединять файлы (в последнее время пользуюсь контейнером mkv и объединяю через mkvmerge)
Так же не раскрыта тема чрезвычайно полезного параметра -threads

Аватар пользователя admin

По поводу опций энкодера H264, то некоторые я нашел и они могут быть заданы в опциях. По поводу многопоточности. А у тебя по умолчанию разве не паралеллится энкодинг? Я принудительно не задаю параметр threads и при этом у меня обработка идет на всех ядрах CPU. Возможно потому, что в Gentoo я изначально собирал ffmpeg с USE флагом +threads