Как мне перевести опции HandbrakeCLI в опции FFmpeg?
У меня есть куча настроек командной строки, которые работают для ручного тормоза, но иногда в некоторых видео (я понятия не имею, почему) ручной тормоз выдает "Исключение из нехватки памяти". Мне было интересно, смогу ли я найти те же клавиши выбора и сделать это с помощью FFmpeg, но это не так легко сделать.
FFmpeg иногда либо не имеет этих опций, либо делает вещи по умолчанию. Например, я не знаю, как сделать пользовательский анаморфоз с FFmpeg. Для меня очень важно, чтобы получающиеся видео были так же хороши, как если бы они были сделаны с ручным тормозом. Вот линия для ручного тормоза:
HandBrakeCLI.exe --input "d:\input.mpg" --output "d:\output.mp4" --rate 29.97 --cfr --arate 44.1 --format mp4 --width 1920 --height 1080 --custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0 --encoder x264 --vb 5200 --aencoder faac --ab 128 --mixdown stereo -x bitrate=5200:vbv-bufsize=5200:vbv-maxrate=5200:level=42:bframes=2:min-keyint=60:keyint=60:ref=4:me=umh:merange=64:subme=7:8x8dct:cabac=1 -v3 -2 -a none
Как мне превратить это в команду FFmpeg?
1 ответ
Ручной тормоз использует кодер x264 для преобразования видео. Есть сайт с обзором всех опций x264 и их аналогов FFmpeg. Однако они немного устарели, и некоторые из этих опций больше не работают или могли быть переименованы. Вы должны использовать профили x264 для большинства параметров детализации, но мы доберемся до них.
Многие из базовых опций ручного тормоза (например, частота кадров) не являются специфичными для x264, и они разбросаны по онлайн-документации FFmpeg.
Прежде чем мы начнем, пожалуйста, убедитесь, что вы используете последнюю версию FFmpeg. Их сайт загрузки имеет статические сборки для всех основных операционных систем.
Поехали:
--input "d:\input.mpg" --output "d:\output.mp4"
Синтаксис FFmpeg
ffmpeg -i input.mpg … d:\output.mp4
,--rate 29.97
Укажите частоту кадров видео с
-r 29.97
, (Handbrake-х--cfr
просто устанавливает постоянную частоту кадров. Не нужно здесь).--arate 44.1
Установите частоту дискретизации звука с помощью
-ar 44100
(в Гц).--format mp4
Не нужно, потому что FFmpeg знает, что вы хотите MP4.
--width 1920 --height 1080 --custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0
Это ничего не делает, кроме установки размера 1920×1080. В FFmpeg сделай это с
-s:v 1920x1080
или, если вы хотите использовать фильтры,-filter:v "scale=1920:1080"
,--encoder x264 --vb 5200
Установите кодировщик с помощью
-c:v libx264
и скорость передачи данных до постоянной-b:v 5200K
, Обратите внимание, что мы еще не там, когда речь идет о настройках качества.--aencoder faac --ab 128 --mixdown stereo
Как и выше, с
-c:a libfaac -b:a 128K -ac 2
, Обратите внимание, что FAAC больше не поддерживается в FFmpeg; вместо этого используйте встроенный кодировщик FFmpeg с-c:a aac -b:a 128K
вместо.-x bitrate=5200:vbv-bufsize=5200:vbv-maxrate=5200
Это устанавливает режим кодирования на VBV, который нацелен на сценарий потоковой передачи, а не просто постоянный битрейт или постоянное качество. Постоянное качество также называется CRF, по умолчанию для x264 - оно называется "Коэффициент коэффициента" в ручном тормозе. Хотя CRF обычно обеспечивает наилучшее качество кодирования, режим VBV дает файл, который лучше подходит для потоковой передачи в Интернете или для определенных устройств с ограниченными возможностями.
Чтобы установить VBV, используйте
-maxrate 5200K
а также-bufsize 5200K
варианты в ffmpeg.Чтобы установить CRF, используйте
-crf 23
в ffmpeg.level=42
использование
-level 42
, Это уровень H.264.bframes=2:min-keyint=60:keyint=60:ref=4
Установите количество B-кадров с помощью
-bf 2
, Минимальный интервал ключевого кадра устанавливается с-keyint_min 60
и максимальный интервал с-g 60
, Количество опорных изображений устанавливается с-refs 4
,me=umh:merange=64:subme=7:8x8dct:cabac=1
Это параметры, которые вы можете установить в ffmpeg дополнительно с помощью
-x264-params me=umh:merange=64:subme=7:8x8dct:cabac=1
- как и любой другой параметр кодера x264, который напрямую не сопоставлен с параметрами ffmpeg.Вот версия "TL;DR", если вы ленивы, не заботитесь о деталях или если что-то не работает: Используйте
-preset:v medium
(или не указывайте, так как предустановка носителя является настройкой по умолчанию). Пресеты x264 выбирают набор опций, которые обменивают скорость кодирования на эффективность сжатия. Они удобно названы изultrafast
,superfast
,veryfast
,faster
,fast
,medium
вslow
,slower
а такжеveryslow
, Выберите то, что вам удобно.
Итак, подведем итог, длинная версия:
ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -b:v 5200K -maxrate 5200K -bufsize 5200K -level 42 -bf 2 -keyint_min 60 -g 60 -refs 4 -x264-params me=umh:merange=64:subme=7:8x8dct:cabac=1 -c:a aac -b:a 128K -ar 44100 d:\output.mp4
Или короткий, который я бы использовал (с кодировкой VBV и удалением нескольких опций):
ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -b:v 5200K -maxrate 5200K -bufsize 5200K -c:a aac -b:a 128K -ar 44100 d:\output.mp4
Переходя к кодированию с постоянным качеством для универсального преобразования, используйте его и измените -crf
параметр от 18 до 28, где ниже означает лучшее качество, а 23 по умолчанию:
ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -crf 23 -c:a aac -b:a 128K -ar 44100 d:\output.mp4