Краткий гайд по тому как сконвертировать видео, что лучше выбрать, без лишней информации
Если вывод идёт в контейнер 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
, текст выглядит намного лучше.
Не берите первый попавшийся файл, он будет говном, потому что долбоёбы не включают в нём поддержку многих полезных функций, например 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.
Самый простой и распространённый кодек. Поддерживается абсолютно везде. До сих пор актуален особенно для разрешений ниже 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.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"
Полностью свободная и бесплатная замена 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"
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
Лучший вариант из доступных, поддерживается везде, даже в 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, то его нужно кодировать через 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
Отличный вариант для аудиофилов нормальных людей.
-c:a flac -compression_level 12
CD качество:
-c:a flac -sample_fmt s16 -ar 44100 -compression_level 12
Слишком сложная тема в которой огромное количество вариантов, зависящих от модели видеокарты, драйверов и остальных параметров. Лучшие варианты кодируют с качеством около x264 medium, но в десятки раз быстрее. Смысл в том, что кодирование идёт очень быстро, вообще не задействуя процессор, что особенно важно в играх, а большой размер можно потом сжать, когда компьютер свободен. У Nvidia есть режим видео без потерь, которые получаются даже меньше чем через программные решения. В последних встройках интела можно закодировать VP9.