Внезапно ваш диск под завязку забит фотографиями и видео, а впереди новые поездки. Что делать, покупать новый, арендовать дисковое пространство на облаке, или может лучше сжать видео файлы через ffmpeg?





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


Библиотека ffmpeg и обработка видео


Библиотека с открытым исходным кодом ffmpeg скорее всего уже установлена на вашей операционной системе. Если же нет, установите его штатной программой управления пакетами, это не займет много времени.


Конвертировать один формат аудио и видео файлов в другой


ffmpeg -i file.<old_extension> [options] file.<new_extension>

Уменьшаем видео, записанное на фотоаппарате:


ffmpeg -i MVI_4703.MOV MVI_4703.avi

То же самое, но с контролем качества.


ffmpeg -i MVI_4703.MOV -q:v 4 MVI_4703.avi

Размер видео уменьшился более чем в 5 раз без ощутимой потери качества. Опция -qscale:v n, сокращенно -q:v n позволяет установить уровень качества генерируемого видеопотока, где n принимает значения в интервале от 1 до 31. Значение 1 соответствует самому лучшему качеству, а 31 — самому худшему.


-rw-r--r-- 1 mig users 124M июл 18 23:29 foto/MVI_4703.avi
-rw-r--r-- 1 mig users 686M июн 27 21:38 foto/MVI_4703.MOV

Указать кодек


Для того, чтобы выбрать нужный нам кодек используем ключи -c:a <codec> -c:v <codec>.


ffmpeg -i video.mp4 -c:v vp9 -c:a libvorbis video.mkv

Увидеть все поддерживаемые кодеки можно командой ffmpeg -codecs.


Поменять контейнер файла


Возьмем теперь такой юзкейс случай. Встроенный плеер вашего телевизора поддерживает формат mkv, но не поддерживает m4v. Для того, чтобы поменять контейнер воспользуемся следующей командой.


ffmpeg -i video.m4v -c:av copy video.mkv

Если же нужно поменять только звук, а видео оставить как есть, запускаем эту команду. Почему-то телевизоры Филипс понимают только форматы звука AAC/AC3.


ffmpeg -i video.m4v -c:v copy -c:a aac video.mkv

Добавить звуковую дорожку


Просто перечисляем файлы ввода и задаем вывод.


ffmpeg -i video.mp4 -i audio.ogg video_sound.mp4

Извлечь звуковую дорожку


Если нужно просто извлечь звук, то можно так.


ffmpeg -i video.MOV -vn audio.ogg

Задаем формат извлекаемой звуковой дорожки.


ffmpeg -i video.MOV -vn -c:a flac audio.flac

Указывает приемлемый битрейт, по умолчанию будет записано 128k.


ffmpeg -i video.MOV -vn -c:a flac -b:a 192k audio.flac

Делаем слайд-шоу из картинок


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


ffmpeg -r .3 -pix_fmt rgba -s 1280x720 -pattern_type glob -i "*.JPGЭ video.mkv

Требуются некоторые пояснения.


  • -r number — частота кадров в секунду.
  • -pix_fmt — Пиксельный формат, список из команды ffmpeg -pix_fmts. Не со всеми форматами получается выставить нужный размер кадра.
  • -pattern_type glob — Для того, чтобы использовать совпадение по шаблону как в командной оболочке. Альтернативой является использование формата C printf, например image%03d.png для всех image0001.png, image0002.png и т. д.

Изменить видеопоток


Допустим, вам нужен не весь видео файл, а лишь часть его. Данная команда вырежет 10 секунд видео, начиная с первой минуты.


ffmpeg -i video_full.m4v -c:av copy -ss 00:01:00 -t 10 video_short.m4v

Как повысить качество потоков аудио или видео? Для этого используется ключ битрейта -b.


ffmpeg - video.webm -c:a copy -c:v vp9 -b:v 2M final.mkv

Захват экрана


Для захвата экрана используется устройство x11grab, а ffmpeg должен быть собран с опцией --enable-x11grab.


ffmpeg -f x11grab -framerate 25 -video_size 4cif -i :0.0 out.mpg

  • -video_size word — Размер захвата, cif = 352x288, 4cif = 704x576. Подробнее в info ffmpeg-utils.

Бонусная дорожка


Для автоматической обработки фотографий удобно работать с программой ImageMagick. Поменять размер всех фотографий в папке.


mogrify -resize 60% *.png

Аккуратное повышение резкости изображения, наподобие Smart Sharpen с помощью Perl скрипта, использующего convert и composite из набора утилит ImageMagick.


Ссылки по теме


  1. Хабрапост про ffmpeg, много полезных команд, однако синтаксис для большинства уже успел поменяться.
  2. A quick guide to using FFmpeg to convert media files
  3. Настройка качества кодировки в FFmpeg: переменный и постоянный битрейт для Mpeg4
Поделиться с друзьями
-->

Комментарии (32)


  1. lorc
    19.07.2017 21:42
    +1

    Спасибо!
    Интересно, а зачем кому-то повышать битрейт? Качество то этого не повысится. А скорее даже понизится из-за перекодирования.


    1. hdfan2
      20.07.2017 07:17
      +1

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


    1. kolipass
      20.07.2017 07:36

      Я так склеивал несколько видео рядов: есть основное видео с высоким, но оптимальным битрейтом. Есть другое видео, битрейт которого ниже — поднимаем его битрейт и склеиваем оба видео. Более простого решения в лоб я не нашёл.


      1. Wernisag
        20.07.2017 08:06

        Обычно проблема не в битрейте, а в количестве кадров


  1. Tihon_V
    19.07.2017 22:17

    Что скажете о использовании h265 и webp под домашние цели (фото/видео)?


    1. PaulZi
      19.07.2017 22:37

      Не автор но отвечу — если не планируется просмотр на устройствах платформы, отличной от PC — то вариант отличный. А вот на разных smart-телевизорах и других поддержка оставляет желать лучшего.


      1. praeivis
        19.07.2017 22:47

        Странно — мой телевизор отказывается показывать видео прямо с камеры. А после того как пережал на х265 показывает без проблем.


        1. hungry_ewok
          20.07.2017 09:01

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


      1. navion
        20.07.2017 00:53

        Это может компенсировать Plex, но медисервер будет шуметь как пылесос кодируя файлы налету.


      1. Laney1
        20.07.2017 14:05

        в смартфонах поддержка HEVC и VP9 — норма примерно с 2014 года, когда Qualcomm и Mediatek выпустили соответствующие SoC


    1. praeivis
      19.07.2017 22:45

      Я последнею неделю как раз занялся домашним видео снятие на GoPro. Но место любимого ffmpeg для х265 попробовал Handbrake и 1080р60 ужался от 3 до 10 раз в зависимости от того что происходит в кадре. 4К видео тоже ужимается, но куда хуже — в среднем только в двое. Но занимает очень много времени, так как программа работает только в 1 поток.
      Так что мне тоже интересно что народ делает с 4К видео — уж очень много оно занимает, сжимается плохо и это занимает много времени. Хотя смотреть очень приятно и возвращаться на 1080 не хочется.


      1. dayfuaim
        20.07.2017 10:54

        HandBrake, кстати, тоже использует ffmpeg. ;)
        И да, он хорошо подходит для того случая, когда не хочется заморачиваться с ключами ffmpeg. :)


        1. zelenin
          20.07.2017 12:00

          HandBrake, кстати, тоже использует ffmpeg. ;)

          но не для x265


  1. PaulZi
    19.07.2017 22:44
    +1

    А ещё в ffmpeg куча фильтров, от resize и crop до шумодавов и стабилизации видео.


    1. zaur45
      20.07.2017 10:54
      +3

      Мне, лично, для стабилизации видео с экшн-камеры помог следующий рецепт в два прохода:


       ffmpeg -i <input_file> -vf vidstabdetect=shakiness=5:show=1 -f null -                      
      ffmpeg -i <input_file> -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 <output_file>
      

      Видео снимаю для домашнего архива, поэтому без примера :)


      1. dayfuaim
        20.07.2017 14:13

        Да, один из самых полезных фильтров. Только для него нужен специально собранный ffmpeg, с поддержкой libvidstab.
        На всякий случай, инструкция по сборке (для Ubuntu): Video Stabilization Using VidStab and FFmpeg on Linux


  1. hdfan2
    20.07.2017 07:21

    Большое спасибо за отличный cheat sheet. Только немного удивил битрейт flac'а. Разве у него есть битрейт? Это же формат сжатия без потерь. У него вроде есть только степень сжатия (с большой степенью размер файла может получиться чуть меньше, но сами данные остаются те же). Битрейт актуален для lossy кодеков.


    1. temujin
      20.07.2017 08:06

      Спасибо, я не обратил внимания. Проверял синтаксис команд и вывод ffmpeg-а. Битрейт действительно меняется, но это не влияет на качество.


  1. OlegFX
    20.07.2017 09:25

    Ссылка на Perl скрипт для повышения резкости изображения не работает: «this goo.gl shortlink has been disabled». И, раз уж пишу в комментариях, поправьте, пожалуйста, вот тут:

    ffmpeg -r .3 -pix_fmt rgba -s 1280x720 -pattern_type glob -i "*.JPGЭ video.mkv

    Вместо закрывающей кавычки 'Э' образовалось.

    Спасибо.


  1. grayich
    20.07.2017 15:25
    +2

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


  1. lmike
    20.07.2017 15:25
    +1

    до кучи — объединение видео (есть и другие варианты):

    ffmpeg -i 'concat:input1|input2' -codec copy output


  1. dcc0
    20.07.2017 16:47

    Захват с тв-тюнера тоже можно, если, например, есть необходимость оцифровать видеокассету VHS. Я c тюнера Pinncle так захватывал:
    ffmpeg -f alsa -ac 2 -i hw:0 -ab 128 -f video4linux2 -s 640x480 -b:v 4800kb -i /dev/video0 -acodec libmp3lame -vcodec h264 out.avi"
    Только иногда еще нужно иметь утилиту v4lctl в системе, чтобы переключиться на композитный режим.


  1. Prous
    20.07.2017 17:59
    +1

    Тот кто умеет пользоваться командной строкой уже давно знает и использует ffmpeg. А вот остальным этот программный продукт покажется сложным и неудобным. Можно было бы упомянуть некоторые бесплатные разработки на базе того же ffmpeg, но с графическим интерфейсом.

    Одна и старейших XviD4PSP, хоть и бывает падает, но всё равно хорошая прога. А вот эту FFAStrans использую на работе для автоматической обработки файлов, позволяет следить за папками и просчитывать материалы с достаточно широкими возможностями. Конечно голый ffmpeg куда как более гибок, но и сложность в его освоении достаточно велика.


  1. kodopik
    21.07.2017 13:33

    Попробуйте вместо

    ffmpeg -i video_full.m4v -c:av copy -ss 00:01:00 -t 10 video_short.m4v
    

    так:
    ffmpeg -ss 00:01:00 -i video_full.m4v -c:av copy -t 10 video_short.m4v
    

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


    1. praeivis
      22.07.2017 10:21

      То есть на ffmpeg влияет порядок команд в строке? o.O


      1. pav5000
        26.07.2017 17:19

        Да, я в своё время долго не мог понять, почему конвертация нормально не работает, пока не осознал, что порядок аргументов имеет значение.


      1. kodopik
        26.07.2017 22:18

        Да. Это ещё более заметно при использовании ключа -map (хотя и более очевидно).


        1. praeivis
          27.07.2017 15:39

          А где можно про это почитать? Или может кто-то собирается это поправит? Если тема поднималась, то что разработчики ответили?


    1. AmnoN
      25.07.2017 11:18

      С резкой файлов не все так просто. Если -ss использовать ПОСЛЕ -i опции то ffmpeg декодирует все ТОЧНО до указанного времени. Именно по этому процедура может быть долгой, если отрывок в конце файла. Если использовать ПЕРЕД -i опции, то используется поиск по ключевым кадрам, этот процесс намного быстрее чем декодирование. Но начало отрезка будет с ключевого кадра, а не с указанного времени. В некоторых случаях это не критично. Но обычно это проблема, например у кодека h264 интервал ключевых кадров по умолчанию 250 (10 секунд). ± 10 секунд от начала времени. Там еще есть нюансы если использовать copy или конвертацию… Короче это тема для отдельной статьи. https://trac.ffmpeg.org/wiki/Seeking


      1. pav5000
        26.07.2017 17:18

        Начиная с версии 2.1 ffmpeg умеет быстро искать с точностью до кадра, когда -ss указывается до -i. За исключением случаев -c:v copy


        1. AmnoN
          26.07.2017 18:26

          В таком случае быстроту поиска омрачает процесс конвертации. И тут все зависит от мощности компьютера, длительности отрезка, настройки кодека.


          1. pav5000
            26.07.2017 18:27

            Я имел ввиду, что применять это стоит только если вам так или иначе надо конвертировать файл.