9

У меня есть куча настроек командной строки, которые работают для ручного тормоза, но иногда на некоторых видео (я понятия не имею, почему) ручной тормоз выдает "Исключение из нехватки памяти". Мне было интересно, смогу ли я найти те же клавиши выбора и сделать это с помощью 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 ответ1

15

Ручной тормоз использует кодер 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 . ( Ручной тормоз --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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .