29090
Comment: fix-ytdlg-link
|
32027
vandalism
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. | Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. Особенности размещения WebM в интернете относятся к Макабе (2ch.hk), если не обозначено иное. |
Line 15: | Line 15: |
Хоть обёртки (т.е. программы, использующие внутри себя FFmpeg, но предоставляющие упрощённый интерфейс) и ограничивают гибкость, они вполне оправданы для типового энкода, если устраивают опции, которые они использует (во многих обёртках можно вводить и raw-опции FFmpeg, но ограничения так или иначе будут). Текущие популярные варианты: * Windows: [[https://gitgud.io/nixx/WebMConverter|WebM for Retards]] * Linux: [[https://pypi.python.org/pypi/webm|webm.py]] (CLI), [[https://github.com/pituz/webm-thread/blob/master/tools/WebMaster|WebMaster]] (CLI), [[https://qwinff.github.io/|QWinFF]] (GUI) |
Хоть обёртки (т.е. программы, использующие внутри себя FFmpeg, но предоставляющие упрощённый интерфейс) и ограничивают гибкость, они вполне оправданы для типового энкода, если устраивают опции, которые они использует (во многих обёртках можно вводить и raw-опции FFmpeg, но ограничения скорее всего будут). Текущие популярные варианты: * Кроссплатформенные: [[../boram|boram]] * Windows: [[https://gitgud.io/nixx/WebMConverter|WebM for Retards]], [[http://www.xmedia-recode.de/|XMedia Recode]] (nonfree) * Linux: [[https://pypi.python.org/pypi/webm|webm.py]] |
Line 25: | Line 26: |
* VP9, умеренное качество, приемлемая скорость: {{{ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -threads 8 -frame-parallel 0 -pix_fmt +yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} * VP9, лучшее качество, но медленно: {{{ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -tile-columns 0 -speed 0 -frame-parallel 0 -pix_fmt +yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} * VP8: {{{ffmpeg -i in.mkv -c:v libvpx -b:v ???k -threads 8 -speed 0 -g 9999 -auto-alt-ref 1 -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} |
* VP9, умеренное качество, приемлемая скорость: {{{ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -threads 8 -g 128 -frame-parallel 0 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} * VP9, лучшее качество, но медленно: {{{ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -tile-columns 0 -speed 0 -g 9999 -frame-parallel 0 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} * VP8: {{{ffmpeg -i in.mkv -c:v libvpx -b:v ???k -threads 8 -speed 0 -g 9999 -auto-alt-ref 1 -lag-in-frames 25 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}} ffmpeg 3.3+/libvpx 1.6.2+ позволяют использовать опцию {{{-row-mt}}} для лучшего распараллеливания процесса транскодинга (доступна в boram). См. [[https://groups.google.com/a/webmproject.org/forum/#!topic/codec-devel/oiHjgEdii2U|описание]]. |
Line 32: | Line 35: |
1. Убедиться, что присутствует ключ {{{-threads 8}}} (или больше) | 1. Убедиться, что '''не''' выбран режим {{{-quality best}}} (good по умолчанию) |
Line 34: | Line 37: |
3. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию) | 3. Убедиться, что присутствует ключ {{{-threads 8}}} (или больше) 4. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию) 5. {{{-row-mt 1}}} (опционально) |
Line 47: | Line 52: |
и т.д. При этом треды энкодера не обязательно будут загружать ядра на 100% в силу ограничений алгоритмов распараллеливания. Если процессор изрядно простаивает, имеет смысл кодировать видео по частам в отдельных процессах FFmpeg, используя опции {{{-ss}}} и {{{-t}}} и склеивая полученные файлы на уровне демуксера. Опция {{{-tile-columns}}} (6 по умолчанию) указывает на максимальное число рекурсивных делений видео на колонки (реальное значение считается как {{{log2(threads)}}}). Следует отметить, что {{{-tile-columns > 0}}}, ровно как и разделение видео на независимые части, приводит к некоторому ухудшению качества итогового видео. | и т.д. При этом треды энкодера не обязательно будут загружать ядра на 100% в силу ограничений алгоритмов распараллеливания. Если процессор изрядно простаивает, имеет смысл кодировать видео по частам в отдельных процессах FFmpeg, используя опции {{{-ss}}} и {{{-t}}} и склеивая полученные файлы на уровне демуксера. Опция {{{-tile-columns}}} (6 по умолчанию) указывает на максимальное число рекурсивных делений видео на колонки (реальное значение считается как {{{log2(threads)}}}). Следует отметить, что {{{-tile-columns > 0}}}, ровно как и разделение видео на независимые части, приводит к некоторому ухудшению качества итогового видео. См. также опцию [[https://groups.google.com/a/webmproject.org/forum/#!topic/codec-devel/oiHjgEdii2U|-row-mt]]. |
Line 52: | Line 57: |
Rate control в libvpx-vp9 ещё далёк от совершенства. Есть несколько способов уменьшить его огрехи: * Для несложных исходников вроде анимации имеет смысл выставить {{{-qmax}}} в районе 30÷35, чтобы избежать undershoot (или использовать CRF, например: {{{-b:v 0 -crf 25}}}) * Для сложных сцен из фильмов {{{-qmin}}} в районе 15÷20 поможет от overshoot Так или иначе, полностью промахов мимо лимита не избежать. Если промах больше 500 килобайт, лучше перекодировать видео со слегка изменёнными {{{-b:v/-qmin/-qmax}}}. Иначе можно перекодировать только аудио и перемуксить со старым видео, выйдет гораздо быстрее по времени (см. [[https://github.com/pituz/webm-thread/blob/master/tools/fit-audio-to-limit|скрипт]]). При совсем небольшом overshoot в районе десятков килобайт, перемуксить с помощью mkvmerge может быть достаточно (муксер mkvmerge чуть более эффективен, чем FFmpeg). Ещё один вариант — обрезать пару секунд с конца ({{{-c copy -t ??}}}), если исходный хронометраж не критичен. |
Rate control в libvpx-vp9 ещё далёк от совершенства. Для несложных исходников вроде анимации имеет смысл выставить {{{-qmax}}} в районе 30÷35, чтобы избежать undershoot (или использовать CRF, например: {{{-b:v 0 -crf 25}}}). Так или иначе, полностью промахов мимо лимита не избежать. Если промах составляет несколько мегабайт, лучше перекодировать видео со слегка изменёнными {{{-b:v/-qmin/-qmax}}}. Можно перекодировать только аудио и перемуксить со старым видео, эта операция занимает совсем немного времени (см. [[https://github.com/Kagami/webm-thread/blob/master/tools/fit-audio-to-limit|скрипт]], [[https://github.com/VP8M8/WebM-Auto-Audio/blob/master/webm-auto-audio.sh|ещё один]]). При совсем небольшом overshoot в районе десятков килобайт, перемуксить с помощью mkvmerge может быть достаточно (муксер mkvmerge чуть более эффективен, чем FFmpeg). Ещё один вариант — обрезать секунды или доли секунды с конца ({{{-c copy -t ??}}}), если исходный хронометраж не критичен. <<Anchor(vbr-crf)>> == VBR vs. CRF == В [[https://arhivach.org/thread/109411/#1434939|некоторых случаях]] 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа {{{-crf}}} под требуемый размер файла. Например: {{{-b:v 0 -crf 50}}} См. также: [[https://www.youtube.com/watch?v=thvSyJN1vsA&t=25m45s|сравнения Netflix компрессии различных режимов libvpx-vp9]]. |
Line 70: | Line 77: |
* Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[https://github.com/pituz/webm-thread/blob/master/tools/add-preview|скрипт]], [[https://hive.blasux.ru/webm/s?action=AttachFile&do=get&target=preview-guide.webm|видеоурок]]) * [[https://github.com/pituz/webm-thread/wiki/Pro-tips#Добавление-превью|Устаревший способ с добавлением кадра в начало основного видео]] Поддержка создания превью через GUI также есть в [[../wybm|wybm]]. |
* Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; Макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[https://github.com/Kagami/webm-thread/blob/master/tools/add-preview|скрипт]], [[https://hive.blasux.ru/webm/s?action=AttachFile&do=get&target=preview-guide.webm|видеоурок]]).<<BR>>'''Внимание:''' многие конвертеры могут некорректно обрабатывать полученное видео. Например, отображать только единственный кадр второй дорожки. Поэтому используйте данный способ, если видео предназначено исключительно для двача. * [[https://github.com/Kagami/webm-thread/wiki/Pro-tips#Добавление-превью|Способ с добавлением кадра превью в начало видео]] Поддержка создания превью через GUI присутствует в [[../wybm|wybm]] и [[../boram|boram]]. |
Line 78: | Line 85: |
Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt +yuv420p}}} | Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt yuv420p}}} |
Line 81: | Line 88: |
== Серый фон в нижней части видео/WebM не помещается в контейнер макабы/растянутое превью == | == Серый фон в нижней части видео/WebM не помещается в контейнер Макабы/растянутое превью == |
Line 101: | Line 108: |
В libvpx-vp9 по умолчанию нет ограничений на частоту появления ключевых кадров ([[https://arhivach.org/thread/120883/#1496522|что экономит битрейт]]), поэтому в видео с редкими сменами сцен их может быть слишком мало, что делает перемотку неудобной (эффективная смена позиции в видео возможна только по границам ключевых кадров). Если быстрая перемотка важнее итогового размера, следуется использовать ключ {{{-g}}}. Например, при {{{-g 120}}} и видео 24 fps, ключевые кадры будут появляеться не реже, чем каждые 5 секунд. | --(В libvpx-vp9 по умолчанию нет ограничений на частоту появления ключевых кадров ([[https://arhivach.org/thread/120883/#1496522|что экономит битрейт]]), поэтому в видео с редкими сменами сцен их может быть слишком мало, что делает перемотку неудобной (эффективная смена позиции в видео возможна только по границам ключевых кадров). Если быстрая перемотка важнее итогового размера, следуется использовать ключ {{{-g}}}. Например, при {{{-g 120}}} и видео 24 fps, ключевые кадры будут появляеться не реже, чем каждые 5 секунд.)-- '''UPDATE:''' В libvpx 1.6.0 значение по умолчанию для {{{kf_max_dist}}} установлено в 128, см. [[http://permalink.gmane.org/gmane.comp.multimedia.webm.devel/2587|[1] ]], [[https://chromium.googlesource.com/webm/libvpx/+/14828e756f92175c1a3c097c1048c01bbfba43a9%5E!/|[2] ]] |
Line 109: | Line 118: |
* Для хардсаба на Windows необходимо предварительно [[https://github.com/pituz/webm-thread/wiki/fontconfig-on-windows|настроить Fontconfig]] | * Для хардсаба на Windows необходимо предварительно [[https://github.com/Kagami/webm-thread/wiki/fontconfig-on-windows|настроить Fontconfig]], либо использовать сборку ffmpeg с включённой опцией !DirectWrite для libass |
Line 116: | Line 125: |
== Рекомендуемые настройки ресайза == | == Настройки ресайза == |
Line 134: | Line 143: |
* В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (поддерживает любые форматы, но шаг перемотки может быть слишком большим) * {{{mkvinfo -v in.webm | grep 'key, track number 1'}}} (при условии, что видео идёт первым треком; поддерживает форматы Matroska, WebM) * {{{webm_info -i in.webm -all | grep key:1}}} (необходимо собрать из [[https://chromium.googlesource.com/webm/webm-tools/+/master/webm_info/|исходников]]; поддерживает формат WebM) * {{{ffprobe -v quiet -show_frames -select_streams v -of compact in.webm | grep key_frame=1}}} (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео) Или же можно использовать специализированную программу [[../wybm|wybm]]. |
* В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (все форматы; шаг перемотки (по умолчанию 5 секунд) можно изменить в настройках) * {{{mkvinfo -v in.webm | grep 'key, track number 1'}}} (mkv/webm; при условии, что видео идёт первым треком) * {{{ffprobe -v quiet -i in.webm -show_packets -select_streams 0:v:0 -of compact | grep flags=K}}} (все форматы) * {{{webm_info -i in.webm -all -noaudio | grep key:1}}} (webm; необходимо собрать из [[https://chromium.googlesource.com/webm/libwebm/+/master/webm_info.cc|исходников]]) Или же можно использовать специализированный софт: [[../wybm|wybm]] (webm), [[https://github.com/ozmartian/vidcutter|VidCutter]] (все форматы, нет подсветки ключевых кадров), [[https://github.com/mifi/lossless-cut|LosslessCut]] (mp4/webm/ogg, нет подсветки ключевых кадров), [[http://avidemux.sourceforge.net/|avidemux]] (все форматы). |
Line 146: | Line 155: |
Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по [[https://github.com/pituz/webm-thread/blob/master/tools/mkvsplit|ссылке]]. | Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по [[https://github.com/Kagami/webm-thread/blob/master/tools/mkvsplit|ссылке]]. |
Line 158: | Line 167: |
* То же самое, но только для файлов с расширениями mkv и webm: {{{mkvmerge -o out.webm 1.webm + 2.mkv + 3.webm}}} | |
Line 172: | Line 182: |
* [[http://forum.ixbt.com/topic.cgi?id=60:2988|Огромный тред на ixbt]] * [[https://ffmpeg.org/ffmpeg-filters.html#framerate|Фильтр для FFmpeg]] * [[https://kaangenc.me/motion-interpolation-24-fps-to-60-fps-with-mpv-vapoursynth-and-mvtools.html|Интерполяция с помощью mpv, VapourSynth и MVTools]] |
* Фильтры [[https://ffmpeg.org/ffmpeg-filters.html#framerate|framerate]] (blend), [[https://ffmpeg.org/ffmpeg-filters.html#minterpolate|minterpolate]] (dup, blend, mci) для FFmpeg * [[http://forum.ixbt.com/topic.cgi?id=60:2988|Длинный тред(ы) на ixbt]] |
Line 176: | Line 185: |
* [[https://www.svp-team.com/wiki/Plugins:_SVPflow|Популярный плагин SVPflow]], [[http://pastebin.com/kwtz9HhQ|гайд]] (Windows only, nonfree) | * [[https://avisynth.org.ru/mvtools/mvtools.html|Плагин MVTools для AviSynth]], [[https://github.com/dubhater/vapoursynth-mvtools|порт под VapourSynth]] * [[https://www.svp-team.com/wiki/Plugins:_SVPflow|Плагин SVPflow для AviSynth/VapourSynth]] (nonfree), [[http://pastebin.com/kwtz9HhQ|гайд]] |
Line 189: | Line 199: |
* По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию {{{-pix_fmt +yuv420p}}} | * По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию {{{-pix_fmt yuv420p}}} |
Line 192: | Line 202: |
<<Anchor(alpha)>> == Как сделать прозрачное видео == Последние версии Firefox и Chrome поддерживают прозрачность в WebM, используйте формат {{{yuva420p}}} в FFmpeg для результирующего видео (выбирается по умолчанию для исходников с прозрачностью, например PNG картинок). Чтобы добавить прозрачность в обычное видео, можно использовать маски, например: {{{ffmpeg -i in.mkv -r ntsc-film -loop 1 -i mask.png -lavfi '[1:v]alphaextract[a];[0:v][a]alphamerge' out.webm}}}<<BR>> {{{mask.png}}} это картинка с тем же разрешением, что и исходное видео, закрашенная чёрным там, где прозрачности быть не должно, и прозрачная в остальных местах. <<Anchor(edge)>> == Как смотреть WebM в Edge == Следует использовать [[https://github.com/Kagami/webmify|данный юзерскрипт]]. |
|
Line 193: | Line 216: |
== Какие цветовые матрицы использовать == По состоянию на январь 2016, Firefox до сих пор использует только цветовую матрицу BT.601 при преобразовании YCbCr в RGB ([[https://bugzilla.mozilla.org/show_bug.cgi?id=1210357|баг]]). Поэтому для одинакового и корректного отображения цветов во всех видах проигрывателей требуется конвертировать исходное видео в BT.601 (фильтр {{{colormatrix}}}) и ставить соответствующий тег (опция {{{-colorspace bt470bg}}}; нужна только для VP9, т.к. VP8 по спецификации может содержать только BT.601). Большая часть современных рипов фильмов и аниме имеет цветовую матрицу BT.709 и фильтр должен иметь следующий вид: {{{-vf colormatrix=bt709:bt601}}}. Старые видео в SD-разрешении обычно имеют матрицу BT.601, поэтому преобразование не требуется, но тег всегда желателен. У некоторых видео может быть уже проставлен тег цветовой матрицы (можно проверить с помощью {{{ffmpeg -i in.mkv}}}), в таком случае он имеет приоритет над приведённой выше эвристикой по разрешению. Также следует иметь ввиду, что FFmpeg по умолчанию использует матрицу BT.601 при конвертации между цветовыми моделями RGB и YCbCr (например, если на входе была PNG-картинка, а на выходе WebM). В ближайшем будущем (2016-2017) ожидается переход на цветовую матрицу и пространство BT.2020 в релизах медиапродукции, что добавит изрядное количество проблем, т.к. нет простого способа преобразовать BT.2020 в BT.709/601. |
== Какой должна быть цветовая матрица == Предпочтительнее использовать BT.709 и соответстующим образом маркировать видео (опция {{{-colorspace bt709}}}). [[https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings#colormatrix|Подробности.]] <<Anchor(hdr)>> == Как кодировать HDR == Примеры для наиболее распространённого bt2020nc/bt2020/smpte2084, с целью дальнейшего просмотра видео на BT.709 устройстве. '''Вариант 1: метаданные''' 1. Опция {{{-colorspace bt2020_ncl}}} при кодировании (не обязательно, но раз предусмотрено поле на уровне VP9, то лучше так). 2. Прописать метаданные на уровне контейнера через {{{mkvmerge --colour-transfer-characteristics 0:16 --colour-primaries 0:9 --max-luminance 0:1000 --min-luminance 0:0.001 in.webm -o out.webm}}} (нужен свежий MKVToolNix). Плюсы: не нужно преобразование цветовых пространств. Минусы: в браузерах будет отображено некорректно. '''Вариант 2: конвертация''' 1. Опция {{{-colorspace bt709}}} при кодировании (для лучшей совместимости с Firefox 52). 2. Фильтр {{{-vf zscale=p=709:t=709:m=709:npl=600}}} (опцию npl можно подкрутить в зависимости от исходника). Плюсы: результат должен выглядеть везде более-менее одинаково. |
Line 204: | Line 242: |
* Linux (Bash): {{{ls *.mp4 | while read f; do ffmpeg -nostdin -i "$f" "${f%.*}.webm"; done}}} | * Linux (Bash): {{{for f in *.mp4; do ffmpeg -i "$f" "${f%.*}.webm"; done}}} * Linux (Zsh): {{{for f in *.mp4; ffmpeg -i $f $f:r.webm }}} |
Line 209: | Line 248: |
* Linux (Bash): {{{find in -type f | while read f; do mkdir -p "out/${f%/*}" && ffmpeg -nostdin -i "$f" "out/${f%.*}.webm"; done}}} | * Linux (Bash): {{{find in -type f -print0 | while read -d $'\0' f; do mkdir -p "out/${f%/*}" && ffmpeg -nostdin -i "$f" "out/${f%.*}.webm"; done}}} * Linux (Zsh): {{{for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -i $f out/$f:r.webm}}} |
Line 240: | Line 280: |
* [[http://www.shotcut.org/|Shotcut]] ([[https://www.shotcut.org/bin/view/Shotcut/TutorialVideos|видеоуроки]]) | * [[https://www.shotcut.org/|Shotcut]] ([[https://www.shotcut.org/bin/view/Shotcut/TutorialVideos|видеоуроки]]) |
Line 253: | Line 293: |
<<Anchor(vbr-crf)>> == VBR vs. CRF == В [[https://arhivach.org/thread/109411/#1434939|некоторых случаях]] 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа {{{-crf}}} под требуемый размер файла. Например: {{{-b:v 0 -crf 50}}} |
|
Line 261: | Line 296: |
* [[https://github.com/Kagami/webm-thread/wiki|Вики для новичков по кодированию с помощью FFmpeg]] | |
Line 267: | Line 303: |
<<BR>> <<Navigation(siblings)>> |
Часто задаваемые вопросы WebM-треда в /s/
Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. Особенности размещения WebM в интернете относятся к Макабе (2ch.hk), если не обозначено иное.
Contents
-
Часто задаваемые вопросы WebM-треда в /s/
- Почему консоль
- Какую обёртку FFmpeg использовать
- Рекомендуемый минимальный набор параметров
- Медленно кодируется VP9/используется только одно ядро
- Процессор всё ещё не полностью загружен при транскодинге в VP9
- VBR не попадает в лимит
- VBR vs. CRF
- При использовании ключа -ss энкодинг начинается не сразу/ключ -to работает некорректно
- Почему миниатюра чёрная/как сделать превью
- Превью не отображается/таб крэшится/зелёная полоса по краям/странные цвета
- Серый фон в нижней части видео/WebM не помещается в контейнер Макабы/растянутое превью
- Нет миниатюр у WebM-файлов в проводнике
- Не работает/тормозит перемотка
- Как прикрепить субтитры
- Настройки ресайза
- Как вырезать участок видео без перекодирования
- Разрезать видео на части
- Склеить видео из нескольких частей
- Почему WebM for Retards …
- 60fps
- Захват видео с экрана
- Как сделать прозрачное видео
- Как смотреть WebM в Edge
- Какой должна быть цветовая матрица
- Как кодировать HDR
- Сконвертировать множество видео за один раз
- Удалить метаданные
- Скачать с YouTube/прочего стриминг-сайта
- Бесплатные видеоредакторы
- Бесплатные аудиоредакторы
- Прочие ссылки
Почему консоль
Преимущество FFmpeg состоит в том, что он предоставляет достаточно низкоуровневый доступ к процессу кодирования, обладая при этом огромной функциональностью. Дело не в том, что консольный интерфейс чем-то лучше, а в возможности управлять каждым параметров энкодера, добиваясь максимально качественного результата. GUI, как правило, данной способности лишены и сильно ограничивают гибкость настройки. Развёрнутый ответ.
Какую обёртку FFmpeg использовать
Хоть обёртки (т.е. программы, использующие внутри себя FFmpeg, но предоставляющие упрощённый интерфейс) и ограничивают гибкость, они вполне оправданы для типового энкода, если устраивают опции, которые они использует (во многих обёртках можно вводить и raw-опции FFmpeg, но ограничения скорее всего будут). Текущие популярные варианты:
Кроссплатформенные: boram
Windows: WebM for Retards, XMedia Recode (nonfree)
Linux: webm.py
Полный список. Онлайн-конвертеры.
Рекомендуемый минимальный набор параметров
VP9, умеренное качество, приемлемая скорость: ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -threads 8 -g 128 -frame-parallel 0 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm
VP9, лучшее качество, но медленно: ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -tile-columns 0 -speed 0 -g 9999 -frame-parallel 0 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm
VP8: ffmpeg -i in.mkv -c:v libvpx -b:v ???k -threads 8 -speed 0 -g 9999 -auto-alt-ref 1 -lag-in-frames 25 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm
ffmpeg 3.3+/libvpx 1.6.2+ позволяют использовать опцию -row-mt для лучшего распараллеливания процесса транскодинга (доступна в boram). См. описание.
Медленно кодируется VP9/используется только одно ядро
Убедиться, что не выбран режим -quality best (good по умолчанию)
Убедиться, что используется версия libvpx >= 1.4.0
Убедиться, что присутствует ключ -threads 8 (или больше)
-tile-columns >= 3 для 8 тредов (6 по умолчанию)
-row-mt 1 (опционально)
Процессор всё ещё не полностью загружен при транскодинге в VP9
libvpx-vp9 использует tile-columns multithreading, поэтому число потоков энкодера зависит от разрешения видео. В общем случае число потоков считается как 2^floor(log2((w+63)/256)), где w — ширина итогового видео. Т.е.:
Ширина <=448px = 1 тред
Ширина >448px = 2 треда
Ширина >960px = 4 треда
Ширина >1984px = 8 тредов
Ширина >4032px = 16 тредов
и т.д. При этом треды энкодера не обязательно будут загружать ядра на 100% в силу ограничений алгоритмов распараллеливания. Если процессор изрядно простаивает, имеет смысл кодировать видео по частам в отдельных процессах FFmpeg, используя опции -ss и -t и склеивая полученные файлы на уровне демуксера. Опция -tile-columns (6 по умолчанию) указывает на максимальное число рекурсивных делений видео на колонки (реальное значение считается как log2(threads)). Следует отметить, что -tile-columns > 0, ровно как и разделение видео на независимые части, приводит к некоторому ухудшению качества итогового видео. См. также опцию -row-mt.
VBR не попадает в лимит
Rate control в libvpx-vp9 ещё далёк от совершенства. Для несложных исходников вроде анимации имеет смысл выставить -qmax в районе 30÷35, чтобы избежать undershoot (или использовать CRF, например: -b:v 0 -crf 25). Так или иначе, полностью промахов мимо лимита не избежать. Если промах составляет несколько мегабайт, лучше перекодировать видео со слегка изменёнными -b:v/-qmin/-qmax. Можно перекодировать только аудио и перемуксить со старым видео, эта операция занимает совсем немного времени (см. скрипт, ещё один). При совсем небольшом overshoot в районе десятков килобайт, перемуксить с помощью mkvmerge может быть достаточно (муксер mkvmerge чуть более эффективен, чем FFmpeg). Ещё один вариант — обрезать секунды или доли секунды с конца (-c copy -t ??), если исходный хронометраж не критичен.
VBR vs. CRF
В некоторых случаях 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа -crf под требуемый размер файла. Например: -b:v 0 -crf 50
См. также: сравнения Netflix компрессии различных режимов libvpx-vp9.
При использовании ключа -ss энкодинг начинается не сразу/ключ -to работает некорректно
При использовании ключа -ss после -i, FFmpeg декодирует видео покадрово до указанного момента. Если опции -ss указана перед -i, будут использоваться ключевые кадры, что значительно ускорит процесс. Однако, ключ -to в таком случае начинает работать как -t. Подробнее. Оптимальное решение: использовать -ss перед -i, не использовать -to (см. также раздел про субтитры).
Почему миниатюра чёрная/как сделать превью
Макаба использует первый кадр видео для генерации миниатюры, который в большинстве фильмов и клипов чёрный. Есть несколько способов получить адекватное превью:
В случае клипа часто достаточно убрать первые полсекунды (-ss 0.5)
Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; Макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек (скрипт, видеоурок).
Внимание: многие конвертеры могут некорректно обрабатывать полученное видео. Например, отображать только единственный кадр второй дорожки. Поэтому используйте данный способ, если видео предназначено исключительно для двача.
Поддержка создания превью через GUI присутствует в wybm и boram.
Превью не отображается/таб крэшится/зелёная полоса по краям/странные цвета
Вероятнее всего была использована плохо поддерживаемая цветовая субдискретизация. Следует перекодировать видео с опцией -pix_fmt yuv420p
Серый фон в нижней части видео/WebM не помещается в контейнер Макабы/растянутое превью
Макаба не поддерживает анаморфные исходники и использует значения PixelWidth/PixelHeight, указанные в файле, тогда как для отображения используются значения DisplayWidth/DisplayHeight.
Пример: допустим, имеется видео со следующими метаданными: Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv), 960x540, SAR 249:224 DAR 83:42, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default). Макаба поместит видео в контейнер размером 960x540, видео же будет отображено браузером в разрешении (960*249/224)x540 = 1067x540 и, как следствие, целиком в контейнер не впишется. Чтобы этого избежать, следует использовать SAR 1:1: -vf scale=960:960/dar
Следует отметить, что миниатюра также будет иметь аспект PixelWidth:PixelHeight, поэтому при SAR не равному 1:1, либо при использовании разных аспектов для первого видео-трека и видео-трека превью, возможно искажение оригинальных пропорций последнего.
Нет миниатюр у WebM-файлов в проводнике
Необходимо установить одну из нижеследующих программ:
Media Preview (Windows, nonfree)
Icaros (Windows, nonfree)
ffmpegthumbnailer (Linux)
Не работает/тормозит перемотка
В libvpx-vp9 по умолчанию нет ограничений на частоту появления ключевых кадров (что экономит битрейт), поэтому в видео с редкими сменами сцен их может быть слишком мало, что делает перемотку неудобной (эффективная смена позиции в видео возможна только по границам ключевых кадров). Если быстрая перемотка важнее итогового размера, следуется использовать ключ -g. Например, при -g 120 и видео 24 fps, ключевые кадры будут появляеться не реже, чем каждые 5 секунд.
UPDATE: В libvpx 1.6.0 значение по умолчанию для kf_max_dist установлено в 128, см. [1], [2]
Как прикрепить субтитры
Браузеры не поддерживают встроенный софтсаб (только внешние сабы через тег <track>), поэтому единственный вариант, не требующий специальной поддержки со стороны сайта, — хардсаб.
Базовый синтаксис: -vf "subtitles=sub.ass" (работает и с файлами типа mkv, mp4)
Для хардсаба на Windows необходимо предварительно настроить Fontconfig, либо использовать сборку ffmpeg с включённой опцией DirectWrite для libass
Если в используемой команде FFmpeg ключ -ss стоит перед -i, требуется добавить фильтр setpts со сдвигом на то же число секунд: -vf "setpts=PTS+??/TB,subtitles=sub.ass,setpts=PTS-STARTPTS" (баг)
Если в файле несколько треков с субтитрами, выбрать нужный можно с помощью опции si, например: -vf "subtitles=in.mkv:si=1" (выберет второй трек с субтитрами; индекс относительный и начинается с нуля)
Правила экранирования специальных символов (проще переименовать файл)
На Windows при указании полного пути до файла с субтитрами, следует использовать синтаксис: -vf "subtitles=C\\:/dir/sub.ass" (проще переместить в текущий каталог)
Настройки ресайза
Фильтр Mitchell-Netravali (-param0 1/3 -param1 1/3) обеспечивает минимальное количество артефактов ресемплинга, при этом облегчая энкодеру задачу, — фильтры типа Lanczos сохраняют слишком много деталей, которые трудно сжимать. См. также:
Как вырезать участок видео без перекодирования
Любое видео должно начинаться с ключевого кадра, поэтому при обрезке фрагмента через -c copy, значение ключа -ss обязано указывать на ключевой кадр с точностью хотя бы до миллисекунды. Заканчиваться же видео может в произвольном месте (на произвольном кадре). Команда в общем случае выглядит так: ffmpeg -i in.webm -ss ??.??? -t ?? -c copy out.webm
Способы узнать метки времени ключевых кадров:
- В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (все форматы; шаг перемотки (по умолчанию 5 секунд) можно изменить в настройках)
mkvinfo -v in.webm | grep 'key, track number 1' (mkv/webm; при условии, что видео идёт первым треком)
ffprobe -v quiet -i in.webm -show_packets -select_streams 0:v:0 -of compact | grep flags=K (все форматы)
webm_info -i in.webm -all -noaudio | grep key:1 (webm; необходимо собрать из исходников)
Или же можно использовать специализированный софт: wybm (webm), VidCutter (все форматы, нет подсветки ключевых кадров), LosslessCut (mp4/webm/ogg, нет подсветки ключевых кадров), avidemux (все форматы).
Разрезать видео на части
mkvmerge --split ??m -o out.webm in.webm
Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по ссылке.
Склеить видео из нескольких частей
Если файлы имеют расширения vob, mpg, ts: ffmpeg -i "concat:1.vob|2.vob|3.vob" -c copy out.vob
Если файлы имеют расширения mkv, webm, mp4, avi и одинаковые форматы: ffmpeg -f concat -i list.txt -c copy out.webm, предварительно создав файл list.txt с содержимым:
file '/path/to/1.webm' file '/path/to/2.webm' file '/path/to/3.webm'
То же самое, но только для файлов с расширениями mkv и webm: mkvmerge -o out.webm 1.webm + 2.mkv + 3.webm
Если в файлах используются разные форматы, необходимо пережатие: ffmpeg -i 1.mp4 -i 2.mkv -lavfi "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" out.webm
Подробнее. Внимание: звуковые дорожки использующие VBR в общем случаев склеивать без пережатия некорректно. Например, Firefox может отказаться проигрывать WebM-файл, полученный из двух других с аудиотреками в формате Opus.
Почему WebM for Retards …
… кодирует короткое видео чуть ли не сутки: нужно убрать опцию -quality best из строки параметров
… обрезает исходное видео по длине: нужно убрать опцию -fs ? из строки параметров
60fps
Искусственное повышение частоты кадров можно считать не более, чем модной игрушкой. В большинстве случаев блендинг/интерполяция дают на выходе много артефактов, а полезность операции остаётся под вопросом. Тем не менее, ниже приведены ссылки на программы и документацию, посвящённые этому вопросу:
Фильтры framerate (blend), minterpolate (dup, blend, mci) для FFmpeg
Видеоурок по Hybrid (nonfree)
Плагин SVPflow для AviSynth/VapourSynth (nonfree), гайд
Захват видео с экрана
Захват звука с ALSA с помощью FFmpeg (Linux only)
Open Broadcaster Software (может захватывать контекст OpenGL/Direct3D)
Несколько советов:
- Если нужно получить видео в формате WebM, то лучше всего захватывать как H.264 lossless/WAV (см. ссылки выше), а затем пережимать в VP9/Opus двумя проходами
При захвате звука, на входе желательно указывать параметры -rtbufsize 1M -thread_queue_size 64, иначе возможны переполнения буфера и разрывы аудиодорожки
По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию -pix_fmt yuv420p
При использовании цветовой модели YCbCr (основная для большинства форматов), полученное видео будет иметь цветовую матрицу BT.601 (дефолтная для FFmpeg), поэтому результирующую WebM лучше соответствующим образом промаркировать (-colorspace bt470bg)
Как сделать прозрачное видео
Последние версии Firefox и Chrome поддерживают прозрачность в WebM, используйте формат yuva420p в FFmpeg для результирующего видео (выбирается по умолчанию для исходников с прозрачностью, например PNG картинок).
Чтобы добавить прозрачность в обычное видео, можно использовать маски, например: ffmpeg -i in.mkv -r ntsc-film -loop 1 -i mask.png -lavfi '[1:v]alphaextract[a];[0:v][a]alphamerge' out.webm
mask.png это картинка с тем же разрешением, что и исходное видео, закрашенная чёрным там, где прозрачности быть не должно, и прозрачная в остальных местах.
Как смотреть WebM в Edge
Следует использовать данный юзерскрипт.
Какой должна быть цветовая матрица
Предпочтительнее использовать BT.709 и соответстующим образом маркировать видео (опция -colorspace bt709). Подробности.
Как кодировать HDR
Примеры для наиболее распространённого bt2020nc/bt2020/smpte2084, с целью дальнейшего просмотра видео на BT.709 устройстве.
Вариант 1: метаданные
Опция -colorspace bt2020_ncl при кодировании (не обязательно, но раз предусмотрено поле на уровне VP9, то лучше так).
Прописать метаданные на уровне контейнера через mkvmerge --colour-transfer-characteristics 0:16 --colour-primaries 0:9 --max-luminance 0:1000 --min-luminance 0:0.001 in.webm -o out.webm (нужен свежий MKVToolNix).
Плюсы: не нужно преобразование цветовых пространств. Минусы: в браузерах будет отображено некорректно.
Вариант 2: конвертация
Опция -colorspace bt709 при кодировании (для лучшей совместимости с Firefox 52).
Фильтр -vf zscale=p=709:t=709:m=709:npl=600 (опцию npl можно подкрутить в зависимости от исходника).
Плюсы: результат должен выглядеть везде более-менее одинаково.
Сконвертировать множество видео за один раз
Задача: сконвертировать все mp4 файлы из текущего каталога в формат WebM.
Linux (Bash): for f in *.mp4; do ffmpeg -i "$f" "${f%.*}.webm"; done
Linux (Zsh): for f in *.mp4; ffmpeg -i $f $f:r.webm
Windows (PowerShell): ls *.mp4 | % { ffmpeg -i $_.name "$($_.basename).webm" }
Задача: сконвертировать все файлы из каталога in в каталог out в формат WebM, сохраняя структуру.
Linux (Bash): find in -type f -print0 | while read -d $'\0' f; do mkdir -p "out/${f%/*}" && ffmpeg -nostdin -i "$f" "out/${f%.*}.webm"; done
Linux (Zsh): for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -i $f out/$f:r.webm
Windows (PowerShell): ls in -rec | ? { !$_.psiscontainer } | % { $d=rvpa -rel $_.directoryname; mkdir -f "out\$d"; ffmpeg -i $_.fullname "out\$d\$($_.basename).webm" }
Удалить метаданные
ffmpeg -i in.webm -c copy -map_metadata -1 out.webm
Скачать с YouTube/прочего стриминг-сайта
youtube-dl (CLI)
Livestreamer (CLI)
wybm (GUI)
4K Video Downloader (GUI)
youtube-dlG (GUI)
JDownloader (GUI)
Complete YouTube Saver (Firefox addon)
KeepVid (online)
savefrom (online)
Бесплатные видеоредакторы
Простые редакторы (cut, crop):
VirtualDub (Windows only)
Полнофункциональные:
Бесплатные аудиоредакторы
Прочие ссылки
/boram /kpop /s /wybm |