Показаны сообщения с ярлыком FFMPEG. Показать все сообщения
Показаны сообщения с ярлыком FFMPEG. Показать все сообщения

вторник, 18 августа 2020 г.

Как с помощью FFMPEG развернуть видео без перекодирования

Всем - здравствуйте!


Прислали недавно видео, которое по всей видимости снимали на телефон и при самом начале съемки развернули с портретного режима в горизонтальный.

При проигрывании файла, видео получается развернуто на 90 градусов.

Для нормального проигрывания видео нужно его развернуть. Как это сделать? На помощь приходит удивительная утилита - комбайн - FFMPEG. 


Для выравнивания видео выполним команду:


ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4 


Следует заметить, что эта команда не перекодирует файл, а значит, во-первых не теряется качество, во-вторых преобразование происходит очень быстро.

суббота, 13 июня 2020 г.

FFMPEG - как изменить громкость видео без перекодирования

Всем доброго дня!


Недавно возник новый вопрос.

Часто присылают видео файлы с очень разным качеством и видео и аудио. В основном я обрабатываю видео так, чтобы подготовить файлы к загрузке на YouTube. Для этого приходится понижать битрейт например с 20000 кб/с до 2500 кб/с.

Однако, подчас поступают файлы с очень низким уровнем записи звука. Что же можно предпринять?

Как обычно, вновь выручает комбайн - утилита FFMPEG. Похоже, она умеет всё. Всё что только возможно сделать с видео и аудио. И, похоже, она работает с любыми контейнерами.



Повышение уровня аудио


Итак, как же повысить уровень аудио дорожки в  видео файле?

Вот так:

ffmpeg -i $INPUT_FILE -vcodec copy -af "volume=10dB" $OUTPUT_FILE

Если же нужно понизить уровень аудио в видео файле, тогда можно сделать вот так:

ffmpeg -i $INPUT_FILE -vcodec copy -af "volume=-10dB" $OUTPUT_FILE

Рецепт, как обычно, найден на просторах Интернет, вот здесь.

Однако, и на оффсайте есть нужная информация.




Нормализация


Ещё более интересным представляется процесс нормализации звуковых дорожек файлов.

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


ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null

с примерно таким выводом:

[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861

Здесь максимальный уровень -5.0 dB, значит нормализация должна быть 5 dB.

Обычный аудио файл
ffmpeg -i input.wav -af "volume=5dB" output.mp3

AVI формат (обычно с mp3)
ffmpeg -i video.avi -af "volume=5dB" -c:v copy -c:a libmp3lame -q:a 2 output.avi

MP4 файл
ffmpeg -i video.mp4 -af "volume=5dB" -c:v copy -c:a aac -b:a 192k output.mp4


О нормализации написано здесь и здесь.


пятница, 24 апреля 2020 г.

Как уменьшить размер видеофайла MP4 изменив битрейт оригинального файла с помощью ffmpeg

Во время самоизоляции потребовалось записать несколько видео. Запись велась на камеру смартфона в формате MP4 с параметрами HD 720p, 30fps. Файл получился достаточно большой - 1 Гб.

С одной стороны, это хорошо. Качество не теряется, картинка чёткая, всё хорошо.

С другой стороны - такой файл мало пригоден для трансляции в веб, например через YouTube. Проблема даже не в качестве 720p, а в большом битрейте. Битрейт результирующего файла оказался выше 14000 kbps, в то время когда рекомендованный для стрима в YouTube битрейт составляет всего от 1500 до 4000 kbps.


Возникает вопрос - что делать, как понизить битрейт у видео, так, чтобы и качество не слишком пострадало и синхронизация с аудиодорожкой была как в исходном видео?

Поскольку я работаю в Linux, решение стал искать под эту платформу. 

Для решения этой задачи можно воспользоваться мощным инструментом - программой (утилитой) ffmpeg. Эта утилита доступна и под Windows и под Mac также.


Поиск в Интернет привёл на широко известный сайт.

Там указан рецепт - что нужно делать, и почему именно так.

Вкратце - команда для уменьшения размера исходного файла выглядит так:

ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4

Пишут, что в 2020 есть новая опция вместо libx254 - libx265 и с ней нужные параметры. Я воспользовался вышеприведённой командой и в результате получил файл почти такого же качества с битрейтом 3914 kbps и размером вместо 1Гб всего 300Мб.

В этом случае команда будет выглядеть вот так

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4


где

input.mp4 - входящий (исходный) файл
libx265 - библиотека обработки
crf - constant rate factor, при значении 23 даёт качество близкое к формату DVD, а понижение значения этого параметра вызовет увеличение качества файла и, соответственно, увеличение результирующего размера.
output.mp4 - результирующий файл


При значении crf=28 из файла размером 3,5 Гб результрующий файл получился размером 122 Мб с битрейтом 356 kbps.
При значении crf=23 из файла размером 3,5 Гб результрующий файл получился размером 255 Мб с битрейтом 894 kbps.
При значении crf=20 из файла размером 3,5 Гб результрующий файл получился размером 435 Мб с битрейтом 1620 kbps.

Все файлы разрешением 1280х720.

Исходя из вышеприведённой таблицы с Гугл, меня устроил вариант со значением crf=20.

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

В общем - велкам!