Jul 21, 2017

Лайфхак по FFmpeg #1

Сегодня первый лайфхак по ffmpeg (для Windows). Мне надоело постоянно запускать какие-то конвертеры и что-то там настраивать. Все чаще я использую ffmpeg вместо адобовской кодилки и из-за качества в т.ч. Пришла мне такая мысль, добавить пункты автоматической конвертации в нужный формат через меню Винды Send To (Отправить), которое вы видите при правом клике на любой файл.

Итак тут первый пример, если пендрите в ffmpeg, то на его основании можете сделать кучу разных пресетов. Все очень просто!

1. Скачайте, установите ffmpeg. Я его к тому же добавила в системный PATH, чтобы можно было легко запустить отовсюду.

2. Создайте .bat файл с текстом (3 строки):
@echo off
"c:\Program Files\ffmpeg\bin\ffmpeg.exe" -i %1 -c:v libx264 -preset slow -crf 18 -c:a copy %1_output.mp4
pause
Назовите этот файл, допустим convert to preview mp4.bat
Если вы установили ffmpeg в отличную папку, измените путь на соответствующий.

3. Положите этот bat файл куда вам удобно (например в документы), создайте его ярлык (перетащите, зажав Alt), а его положите в папочку %userprofile%/SendTo
Переименуйте его, если необходимо убрать слово "Ярлык", но не изменяйте расширения .lnk, также вы можете изменить в его свойствах иконку и настройки консоли. Если вы вдруг не можете найти папку SendTo, то загляните в ...\AppData\Roaming\Microsoft\Windows\SendTo, но обычно на нее есть ярлык в папке юзера.

4. Теперь вам достаточно в проводнике кликнуть по любому видео правой кнопкой и выбрать Send To, там вы увидите то самое название convert to preview mp4 (или как вы там переименовали сам ярлык). Команда добавляет к имени исходного файла  _output.mp4, сохранится файл в исходную папочку.

Конкретно этот пресет создает h264 high 4:2:2 L3.1, yuv422p, а звуковую дорожку копирует как есть из исходника. Позже сделаю еще несколько бат-файлов с разными вариантами сжатия. Пишите, какие вам нужны. А далее я расскажу как собрать секвенции, как конвертить стерео, как размукзсить или замуксить mkv.

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

Подсказка. Скорость потока регулируется ключом -crf, значения от 0 (lossless) до 53 (и до 63 в 10-битном цвете) по экспоненциальной шкале, т.е. разность в 6 единиц = изменение потока в 2 раза. Значение 18 принято считать visually lossless. Но на скорость потока влияет и параметр -preset.

ПС. Да, я знаю, есть много GUI для ffmpeg, но среди опробованных мною ни один не прижился. Этот способ чрезвычайно прост, бесплатен, вся процедура займет у вас считанные минуты. Пожалуйста!

АПДЕЙТ
Вот такие три варианта настроек у меня в работе сейчас, пока все mp4, добавилась проверка на передачу параметра. Три текста для отдельных bat-фалов:

h264 mp4 420p законстрейнейный под level3.0 (более совместимый со старыми устройствами и плеерами)
@ECHO OFF
IF %1.==. (
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     NO FILE SPECIFIED                                ]
ECHO [------------------------------------------------------]
) ELSE (
"c:\Program Files\ffmpeg\bin\ffmpeg.exe" -v warning -i %1 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -preset slow -crf 24 -c:a aac -b:a 128k -y %1_420_constrL3.mp4
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     SERVED                                           ]
ECHO [------------------------------------------------------]
)
PAUSE
h264 mp4 422p medium quality, slower
@ECHO OFF
IF %1.==. (
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     NO FILE SPECIFIED                                ]
ECHO [------------------------------------------------------]
) ELSE (
"c:\Program Files\ffmpeg\bin\ffmpeg.exe" -v warning -i %1 -c:v libx264 -preset slower -crf 16 -pix_fmt yuv422p -c:a copy -y %1_422_medium_slower.mp4
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     SERVED                                           ]
ECHO [------------------------------------------------------]
)
PAUSE
h264 mp4 422p high quality, slower
@ECHO OFF
IF %1.==. (
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     NO FILE SPECIFIED                                ]
ECHO [------------------------------------------------------]
) ELSE (
"c:\Program Files\ffmpeg\bin\ffmpeg.exe" -v warning -i %1 -c:v libx264 -preset slower -crf 8 -pix_fmt yuv422p -c:a copy -y %1_422_highest_slower.mp4
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [     SERVED                                           ]
ECHO [------------------------------------------------------]
)
PAUSE