Skip to content

Latest commit

 

History

History
207 lines (120 loc) · 18.8 KB

FFmpeg кодирование гайд.md

File metadata and controls

207 lines (120 loc) · 18.8 KB

FFmpeg самый простой гайд по кодированию

Краткий гайд по тому как сконвертировать видео, что лучше выбрать, без лишней информации

Примечение, то что актуально для всех кодеков

Если вывод идёт в контейнер MP4, добавляйте в конец командной строки -movflags +faststart. Это позволит смотреть файл до полной загрузки.

При использовании 10 бит, видео будет сжиматься лучше, даже если исходный был в 8 бит. Но немного дольше кодируется видео, и может не поддерживать видеокарта (H.264 и VP9 никто не поддерживает, H.265 часто встречается, AV1 если есть в видеокарте, то обязан поддерживать) Это из-за того, что при сжатии значения округляются, а для 10 бит будет меньше ошибки. Он включается параметром -pix_fmt yuv420p10le, а 8 бит это -pix_fmt yuv420p.

-hwaccel лучше не использовать, он может ухудшить качество видео, и скорее сделает только медленее.

В очень редких случаях при кодировании второго прохода может выдать ошибку Incomplete MB-tree stats file.. Чтобы исправить, закодируйте первый проход с прям точно такими же параметрами, как и во втором, аудиокодек и т.д., и укажите любое название выходного файла.

Лайфхак: Для записи рабочего стола можно выбрать в OBS yuv444p yuv444p10le, текст выглядит намного лучше.

Где взять FFmpeg

Не берите первый попавшийся файл, он будет говном, потому что долбоёбы не включают в нём поддержку многих полезных функций, например FDK и SoX, всегда берите билды Nonfree, например отсюда:

https://github.com/AnimMouse/ffmpeg-autobuild

Для шизиков: сборка идёт на серверах гитхаба, напрямую из исходников вместе с патчами которые у всех на виду, шанс каких либо майнеров КРАЙНЕ МАЛ

А вообще список тут:

https://www.animmouse.com/p/ffmpeg-binaries/

Режимы кодирования

Есть два режима которые следует использовать: CRF или с указанием битрейта.

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

Примерная таблица по подбору значений:

  • 18-22 для 480p/576p Standard Definition
  • 19-23 для 720p High Definition
  • 20-24 для 1080p Full High Definition
  • 22-28 для 2160p 4K Ultra High Definition

источник

Второй когда есть какое-то жёсткое ограничение по размеру, например для форумов.

Например нужно получить файл не больше 10 мегабайт или 10000 килобайт.

Для этого переводите килобайты в килобиты и делите на количество секунд в видео: 10000 * 8 / 35 получается 2340 килобит в секунду (ещё бы учитывать битрейт аудио) -b:v 2340k, или такая скорость интернета потребуется для просмотра в прямом эфире.

Вот хороший калькулятор: ссылка

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

CQ и остальные выглядят хуже потому что предназначены для другого и поэтому не рекомендуются! Если в видеокарте нет такого, берите CBR

Контейнеры

MP4, WEBM, MKV это просто файл, как архив которые хранят в себе закодированные видео и аудио. Чтобы посмотреть что лежит внутри файла, есть MediaInfo, или ffmpeg -i "1.mkv".

  • MP4 - самый распространённый контейнер, накрыт патентами, поддерживается везде, и в браузерах, и в говноедских редакторах видео и системах (например выблядки из эппл и адоб, которые специально не поддерживают свободные форматы, чтобы им платили отчисления). С недавнего времени может хранить в себе что угодно H264, H265, Opus, AAC, FLAC, даже VP9 и AV1, хотя некоторые плееры могут охуеть с такого. Например, можно заремуксить webm в mp4, чтобы телеграм показывал это как видео, а не файл. Не может хранить другое аудио без потерь кроме FLAC и ALAC, которые в редакторах не открываются, но зато похожий контейнер .MOV может хранить wav -c:a pcm_s16le 1.mov. Минусы то что не поддерживает несколько аудиодорожек, несвабодный и требует костылей с faststart, и вообще сложно устроен. Если во время записи закрыть программу, файл будет битый, в отличии от MKV (можно спасти с помощью untrunc). Есть mp4box для работы с ним.
  • Matroska - классическая матрёшка которая может хранить всё что угодно, несколько дорожек, какие угодно субтитры, нашла своё признание на торрентах. Может проигрываться в браузерах, если поменять расширение, а иначе скачивается как файл, искуственное дебильное ограничение. А так же годнота MKVToolNix, в которой можно двигать дорожки как угодно, очень удобная штука.
  • WebM - аналог от гугла для своих свободных кодеков, обычная Matroska, но с жёстким набором поддерживаемых кодеков: VP8, VP9, AV1, Opus и Vorbis.

H.264

Самый простой и распространённый кодек. Поддерживается абсолютно везде. До сих пор актуален особенно для разрешений ниже 1080p или когда нужна высокая скорость кодирования. Новые кодеки сделают видео с более худшим качеством, если выбрать аналогичный по скорости пресет.

Не используйте пресеты медленее чем slow, (slower, veryslow, placebo) в них нет смысла.

https://trac.ffmpeg.org/wiki/Encode/H.264

CRF:

ffmpeg -i "1.mkv" -c:v libx264 -crf 30 -preset slow "out.mkv"

Битрейт:

Можно написать чтобы первый проход был качественее -fastfirstpass false

ffmpeg -i "1.mkv" -c:v libx264 -b:v 5000k -preset slow -pass 1 -an -f null -
ffmpeg -i "1.mkv" -c:v libx264 -b:v 5000k -preset slow -pass 2 "out.mkv"

H.265

Дальнейшее развитие H.264, но не приобрёл популярности и поддержки в браузерах из-за непонятных патентов. Если вам не нужно показывать видео через браузер, это лучший вариант из-за поддержки аппаратным ускорением. Если у вас мощные устройства - переходите на AV1. Информация выше подходит, только можно использовать 10 бит, из-за поддержки большинством устройств

https://trac.ffmpeg.org/wiki/Encode/H.265

CRF:

ffmpeg -i "1.mkv" -c:v libx265 -crf 30 -preset medium -pix_fmt yuv420p10le "out.mkv"

Битрейт:

Можно написать чтобы первый проход был побыстрее -x265-params pass=1:no-slow-firstpass=1

ffmpeg -i "1.mkv" -c:v libx265 -b:v 5000k -preset medium -pix_fmt yuv420p10le -x265-params pass=1 -an -f null -
ffmpeg -i "1.mkv" -c:v libx265 -b:v 5000k -preset medium -pix_fmt yuv420p10le -x265-params pass=2 "out.mkv"

VP9

Полностью свободная и бесплатная замена H.265 но не имеет нормального кодировщика. На практике показывает результаты чуть лучше чем у x264, но хуже x265. Сложнее в настройке и требует значительно больше времени на сжатие. Используйте только если хотите получить видео для браузера, и оно никак не влезает в нужный размер, в приемлемом качестве в H.264, хотя в этом случае можно и AV1 применить.

Примечание: нужно всегда кодировать в два прохода для лучшего качества, первый проход идёт быстро в отличии от других кодеков.

Ниже написаны наиболее оптимальные настройки, включены все штуки улучшующие качество с учётом нормальной скорости кодирования. -cpu-used это аналог -preset, меньше число - медленее. Оптимально 3 или 4, значение больше сделает первый проход очень медленным.

https://trac.ffmpeg.org/wiki/Encode/VP9

https://www.reddit.com/r/AV1/comments/k7colv/encoder_tuning_part_1_tuning_libvpxvp9_be_more/

CRF:

ffmpeg -i "1.mkv" -c:v libvpx-vp9 -quality good -cpu-used 4 -crf 30 -b:v 0 -pix_fmt yuv420p -lag-in-frames 25 -tile-columns 2 -tile-rows 0 -threads 8 -row-mt 1 -auto-alt-ref 1 -enable-tpl 1 -pass 1 -an -f null -

ffmpeg -i "1.mkv" -c:v libvpx-vp9 -quality good -cpu-used 4 -crf 30 -b:v 0 -pix_fmt yuv420p -lag-in-frames 25 -tile-columns 2 -tile-rows 0 -threads 8 -row-mt 1 -auto-alt-ref 1 -enable-tpl 1 -pass 2 "out.webm"

Битрейт:

ffmpeg -i "1.mkv" -c:v libvpx-vp9 -quality good -cpu-used 4 -b:v 5000k -pix_fmt yuv420p -lag-in-frames 25 -tile-columns 2 -tile-rows 0 -threads 8 -row-mt 1 -auto-alt-ref 1 -enable-tpl 1 -pass 1 -an -f null -

ffmpeg -i "1.mkv" -c:v libvpx-vp9 -quality good -cpu-used 4 -b:v 5000k -pix_fmt yuv420p -lag-in-frames 25 -tile-columns 2 -tile-rows 0 -threads 8 -row-mt 1 -auto-alt-ref 1 -enable-tpl 1 -pass 2 "out.webm"

AV1

SVT-AV1 наконец-то получил финальную версию 1.0, обзавёлся документацией и теперь выдаёт невероятные результаты! Не требует пердолинга с параметрами, полностью нагружает процессор без деления видео на части, выдаёт лучше качество чем x265 - просто самый охуенный кодировщик. Остальное говно libaom и rav1e нинужно.

Пресеты 1-3 для экстремально эффективного сжатия, если нужен размер и качество любой ценой, 4-6 рекомендуется обычным пользователям, разумный баланс, 7-12 для сжатия в реальном времени.

https://github.com/AOMediaCodec/SVT-AV1/blob/master/Docs/CommonQuestions.md

Скорость 6 кодирует где-то в два раза дольше чем x265 slow, а по качеству лучше даже чем x265 slower, который в 6 раз медленее slow.

Поддерживается в браузерах, на телефонах, но редко встречается аппартное ускорение, нету ни в одном Qualcomm и эплодерьме (эти мрази даже в браузер его не завезли), но есть в MediaTek Dimensity, Amlogic S905X4, и в самых современнных компьютерных видеокартах. Если есть аппаратное ускорение, то поддержка 10 бит обязательно будет.

Чем больше разрешение и битрейт, тем сильнее процессор нагружается. Чтобы открыть 4K30 10 Мбит/с без ускорения требуется производительный 6/12 процессор, на телефоне даже 888 снап у меня не тянет. 1080p должно открыть всё что угодно, 720p даже устаревший мусор потянет. Главное иметь самую последнуюю версию dav1d. Можно дописать после двоеточия fast-decode=1 если уж приспичило.

Указаны два параметра которые рекомендуются в руководстве для повышения качества видео.

Можно ещё указать film-grain=8 если у вас в видео есть шумы, перед сжатием они будет применён алгоритм убирающий шумы, и в видео записана информация как их воссоздать, за счёт чего степень сжатия и качество видео возрастает очень сильно.

ffmpeg -i "1.mkv" -c:v libsvtav1 -preset 6 -pix_fmt yuv420p10le -crf 28 -svtav1-params tune=0:irefresh-type=1 svt.mkv

Два прохода пока не поддерживается в ffmpeg, но вроде он и без них нормально справляется

ffmpeg -i "1.mkv" -c:v libsvtav1 -preset 6 -pix_fmt yuv420p10le -b:v 5000k -svtav1-params tune=0:irefresh-type=1 svt.mkv

Аудио

Opus

Лучший вариант из доступных, поддерживается везде, даже в MP4. Оптимальный битрейт 160k, используется на ютубчике, по тестам звучит лучше чем 320k mp3, на самом деле это не CBR а VBR, так что размер может изменятся для лучшего качества. При низких битрейтах включаются специальные режимы, как при выборе кодеков HE-AAC и HE-AAC v2, но это делается автоматически и везде поддерживается, в отличии от этих двух.

https://wiki.hydrogenaud.io/index.php?title=Opus

Есть хитрость позволяющая немного улучшить качество, использовать другую библиотеку для преобразования, если не работает уберите -filter ...:

-c:a libopus -b:a 160k -filter:a "aresample=48000:resampler=soxr:precision=33"

AAC

Если зачем-то нужен AAC, то его нужно кодировать через FDK AAC который по умолчанию не прилагается в FFmpeg. Чем меньше VBR тем сильнее сжатие, 5 оптимальнее всего (битрейт около 128k). Слишком агрессивный фильтр частот по умолчанию я рекомедную отключить.

https://trac.ffmpeg.org/wiki/Encode/AAC

https://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC

-c:a libfdk_aac -vbr 5 -cutoff 20000

FLAC

Отличный вариант для аудиофилов нормальных людей.

-c:a flac -compression_level 12

CD качество:

-c:a flac -sample_fmt s16 -ar 44100 -compression_level 12

Аппаратное кодирование

Слишком сложная тема в которой огромное количество вариантов, зависящих от модели видеокарты, драйверов и остальных параметров. Лучшие варианты кодируют с качеством около x264 medium, но в десятки раз быстрее. Смысл в том, что кодирование идёт очень быстро, вообще не задействуя процессор, что особенно важно в играх, а большой размер можно потом сжать, когда компьютер свободен. У Nvidia есть режим видео без потерь, которые получаются даже меньше чем через программные решения. В последних встройках интела можно закодировать VP9.