Внезапно ваш диск под завязку забит фотографиями и видео, а впереди новые поездки. Что делать, покупать новый, арендовать дисковое пространство на облаке, или может лучше сжать видео файлы через ffmpeg?
![](https://habrastorage.org/web/451/f30/a09/451f30a091174b44b05ab40017542dc6.png)
Впрочем зачем себя ограничивать экономией дискового пространства? Предлагаю узнать удивительные возможности обработки фотографий, аудио и видео данных, утилитами командной строки.
Библиотека 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.
Ссылки по теме
- Хабрапост про ffmpeg, много полезных команд, однако синтаксис для большинства уже успел поменяться.
- A quick guide to using FFmpeg to convert media files
- Настройка качества кодировки в FFmpeg: переменный и постоянный битрейт для Mpeg4
Комментарии (32)
Tihon_V
19.07.2017 22:17Что скажете о использовании h265 и webp под домашние цели (фото/видео)?
PaulZi
19.07.2017 22:37Не автор но отвечу — если не планируется просмотр на устройствах платформы, отличной от PC — то вариант отличный. А вот на разных smart-телевизорах и других поддержка оставляет желать лучшего.
praeivis
19.07.2017 22:47Странно — мой телевизор отказывается показывать видео прямо с камеры. А после того как пережал на х265 показывает без проблем.
hungry_ewok
20.07.2017 09:01Повезло, значит.
Увы, с поддержкой всяких экзотических и самых современных кодеков в бытовой технике, а также с обновлениями — лютый, бешеный швах.
navion
20.07.2017 00:53Это может компенсировать Plex, но медисервер будет шуметь как пылесос кодируя файлы налету.
Laney1
20.07.2017 14:05в смартфонах поддержка HEVC и VP9 — норма примерно с 2014 года, когда Qualcomm и Mediatek выпустили соответствующие SoC
praeivis
19.07.2017 22:45Я последнею неделю как раз занялся домашним видео снятие на GoPro. Но место любимого ffmpeg для х265 попробовал Handbrake и 1080р60 ужался от 3 до 10 раз в зависимости от того что происходит в кадре. 4К видео тоже ужимается, но куда хуже — в среднем только в двое. Но занимает очень много времени, так как программа работает только в 1 поток.
Так что мне тоже интересно что народ делает с 4К видео — уж очень много оно занимает, сжимается плохо и это занимает много времени. Хотя смотреть очень приятно и возвращаться на 1080 не хочется.
PaulZi
19.07.2017 22:44+1А ещё в ffmpeg куча фильтров, от resize и crop до шумодавов и стабилизации видео.
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>
Видео снимаю для домашнего архива, поэтому без примера :)
dayfuaim
20.07.2017 14:13Да, один из самых полезных фильтров. Только для него нужен специально собранный ffmpeg, с поддержкой
libvidstab
.
На всякий случай, инструкция по сборке (для Ubuntu): Video Stabilization Using VidStab and FFmpeg on Linux
hdfan2
20.07.2017 07:21Большое спасибо за отличный cheat sheet. Только немного удивил битрейт flac'а. Разве у него есть битрейт? Это же формат сжатия без потерь. У него вроде есть только степень сжатия (с большой степенью размер файла может получиться чуть меньше, но сами данные остаются те же). Битрейт актуален для lossy кодеков.
temujin
20.07.2017 08:06Спасибо, я не обратил внимания. Проверял синтаксис команд и вывод
ffmpeg
-а. Битрейт действительно меняется, но это не влияет на качество.
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
Вместо закрывающей кавычки 'Э' образовалось.
Спасибо.
grayich
20.07.2017 15:25+2imagemagick в стагнации, вместо него рекомендуется использовать graphicsmagick, который в целом имеет тот-же синтаксис, но отличается большей производительностью и меньшим потреблением ресурсов.
lmike
20.07.2017 15:25+1до кучи — объединение видео (есть и другие варианты):
ffmpeg -i 'concat:input1|input2' -codec copy output
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 в системе, чтобы переключиться на композитный режим.
Prous
20.07.2017 17:59+1Тот кто умеет пользоваться командной строкой уже давно знает и использует ffmpeg. А вот остальным этот программный продукт покажется сложным и неудобным. Можно было бы упомянуть некоторые бесплатные разработки на базе того же ffmpeg, но с графическим интерфейсом.
Одна и старейших XviD4PSP, хоть и бывает падает, но всё равно хорошая прога. А вот эту FFAStrans использую на работе для автоматической обработки файлов, позволяет следить за папками и просчитывать материалы с достаточно широкими возможностями. Конечно голый ffmpeg куда как более гибок, но и сложность в его освоении достаточно велика.
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
На больших файлах, и если нужно вырезать из самого конца, очень серьёзно сокращает время обработки.AmnoN
25.07.2017 11:18С резкой файлов не все так просто. Если -ss использовать ПОСЛЕ -i опции то ffmpeg декодирует все ТОЧНО до указанного времени. Именно по этому процедура может быть долгой, если отрывок в конце файла. Если использовать ПЕРЕД -i опции, то используется поиск по ключевым кадрам, этот процесс намного быстрее чем декодирование. Но начало отрезка будет с ключевого кадра, а не с указанного времени. В некоторых случаях это не критично. Но обычно это проблема, например у кодека h264 интервал ключевых кадров по умолчанию 250 (10 секунд). ± 10 секунд от начала времени. Там еще есть нюансы если использовать copy или конвертацию… Короче это тема для отдельной статьи. https://trac.ffmpeg.org/wiki/Seeking
pav5000
26.07.2017 17:18Начиная с версии 2.1 ffmpeg умеет быстро искать с точностью до кадра, когда -ss указывается до -i. За исключением случаев -c:v copy
lorc
Спасибо!
Интересно, а зачем кому-то повышать битрейт? Качество то этого не повысится. А скорее даже понизится из-за перекодирования.
hdfan2
Скорее всего, автор имел в виду такую проблему: по каким-то причинам нужно перекодировать аудио/видео из одного lossy формата в другой. В этом случае с настройками по умолчанию качество может получиться не очень, и иногда имеет смысл увеличить битрейт выходных данных, чтобы улучшить качество.
kolipass
Я так склеивал несколько видео рядов: есть основное видео с высоким, но оптимальным битрейтом. Есть другое видео, битрейт которого ниже — поднимаем его битрейт и склеиваем оба видео. Более простого решения в лоб я не нашёл.
Wernisag
Обычно проблема не в битрейте, а в количестве кадров