29462
Comment: fix-shotcut-link
|
32247
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. <<TableOfContents>> |
Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. Особенности размещения WebM в интернете относятся к Макабе (2ch.hk), если не обозначено иное. <<TableOfContents>> |
Line 8: | Line 5: |
Line 9: | Line 7: |
Line 13: | Line 10: |
Line 14: | Line 12: |
Хоть обёртки (т.е. программы, использующие внутри себя 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, но ограничения скорее всего будут). Текущие популярные варианты: * Кроссплатформенные: [[webm/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 23: | Line 21: |
Line 24: | Line 23: |
* 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 30: | Line 30: |
Line 31: | Line 32: |
1. Убедиться, что '''не''' выбран режим {{{-quality best}}} (good по умолчанию) 1. Убедиться, что используется версия {{{libvpx >= 1.4.0}}} |
|
Line 33: | Line 35: |
2. Убедиться, что используется версия {{{libvpx >= 1.4.0}}} 3. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию) |
1. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию) 1. {{{-row-mt 1}}} (опционально) |
Line 37: | Line 39: |
Line 38: | Line 41: |
Line 47: | Line 49: |
и т.д. При этом треды энкодера не обязательно будут загружать ядра на 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 50: | Line 52: |
Line 51: | Line 54: |
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 60: | Line 64: |
Line 61: | Line 66: |
Line 65: | Line 69: |
Line 66: | Line 71: |
Line 70: | Line 74: |
* Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[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 присутствует в [[webm/wybm|wybm]] и [[webm/boram|boram]]. |
Line 76: | Line 80: |
Line 77: | Line 82: |
Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt +yuv420p}}} |
Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt yuv420p}}} |
Line 81: | Line 85: |
== Серый фон в нижней части видео/WebM не помещается в контейнер макабы/растянутое превью == |
== Серый фон в нижней части видео/WebM не помещается в контейнер Макабы/растянутое превью == |
Line 90: | Line 94: |
Line 91: | Line 96: |
Line 99: | Line 103: |
Line 100: | Line 105: |
В 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^!/|[2]]] |
Line 104: | Line 110: |
Line 105: | Line 112: |
Line 109: | Line 115: |
* Для хардсаба на 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 122: |
== Рекомендуемые настройки ресайза == |
== Настройки ресайза == |
Line 128: | Line 134: |
Line 129: | Line 136: |
Line 134: | Line 140: |
* В 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|исходников]]) Или же можно использовать специализированный софт: [[webm/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 142: | Line 148: |
Line 143: | Line 150: |
Line 146: | Line 152: |
Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по [[https://github.com/pituz/webm-thread/blob/master/tools/mkvsplit|ссылке]]. | Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по [[https://github.com/Kagami/webm-thread/blob/master/tools/mkvsplit|ссылке]]. |
Line 149: | Line 155: |
Line 150: | Line 157: |
Line 153: | Line 159: |
Line 158: | Line 165: |
* То же самое, но только для файлов с расширениями mkv и webm: {{{mkvmerge -o out.webm 1.webm + 2.mkv + 3.webm}}} | |
Line 163: | Line 171: |
Line 164: | Line 173: |
Line 169: | Line 177: |
Line 172: | Line 179: |
* [[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 182: |
* [[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 179: | Line 186: |
Line 180: | Line 188: |
Line 189: | Line 196: |
* По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию {{{-pix_fmt +yuv420p}}} | * По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию {{{-pix_fmt yuv420p}}} |
Line 192: | Line 199: |
<<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 212: |
== Какие цветовые матрицы использовать == По состоянию на январь 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.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, то лучше так). 1. Прописать метаданные на уровне контейнера через {{{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). 1. Фильтр {{{-vf zscale=p=709:t=709:m=709:npl=600}}} (опцию npl можно подкрутить в зависимости от исходника). Плюсы: результат должен выглядеть везде более-менее одинаково. |
Line 202: | Line 236: |
Line 203: | Line 238: |
Line 206: | Line 240: |
* Linux (Bash): {{{for f in *.mp4; do ffmpeg -nostdin -i "$f" "${f%.*}.webm"; done}}} * Linux (Zsh): {{{for f in *.mp4; ffmpeg -nostdin -i $f $f:r.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 }}} |
Line 213: | Line 247: |
* Linux (Zsh): {{{for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -nostdin -i $f out/$f:r.webm}}} | * Linux (Zsh): {{{for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -i $f out/$f:r.webm}}} |
Line 217: | Line 251: |
Line 218: | Line 253: |
Line 222: | Line 256: |
Line 223: | Line 258: |
Line 226: | Line 260: |
* [[../wybm|wybm]] (GUI) | * [[webm/wybm|wybm]] (GUI) |
Line 235: | Line 269: |
Line 236: | Line 271: |
Line 252: | Line 286: |
Line 253: | Line 288: |
Line 257: | Line 291: |
<<Anchor(vbr-crf)>> == VBR vs. CRF == В [[https://arhivach.org/thread/109411/#1434939|некоторых случаях]] 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа {{{-crf}}} под требуемый размер файла. Например: {{{-b:v 0 -crf 50}}} |
|
Line 263: | Line 292: |
Line 264: | Line 294: |
* [[https://github.com/Kagami/webm-thread/wiki|Вики для новичков по кодированию с помощью FFmpeg]] | |
Line 271: | Line 301: |
<<BR>> <<Navigation(siblings)>> |
Часто задаваемые вопросы WebM-треда в /s/
Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне webm-thread wiki. Все нижеследующие ключи относятся к 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 |