Часто задаваемые вопросы WebM-треда в /s/

Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. Особенности размещения WebM в интернете относятся к Макабе (2ch.hk), если не обозначено иное.

<<TableOfContents: execution failed [list index out of range] (see also the log)>>

Почему консоль

Преимущество FFmpeg состоит в том, что он предоставляет достаточно низкоуровневый доступ к процессу кодирования, обладая при этом огромной функциональностью. Дело не в том, что консольный интерфейс чем-то лучше, а в возможности управлять каждым параметров энкодера, добиваясь максимально качественного результата. GUI, как правило, данной способности лишены и сильно ограничивают гибкость настройки. Развёрнутый ответ.

Какую обёртку FFmpeg использовать

Хоть обёртки (т.е. программы, использующие внутри себя FFmpeg, но предоставляющие упрощённый интерфейс) и ограничивают гибкость, они вполне оправданы для типового энкода, если устраивают опции, которые они использует (во многих обёртках можно вводить и raw-опции FFmpeg, но ограничения скорее всего будут). Текущие популярные варианты:

Полный список. Онлайн-конвертеры.

Рекомендуемый минимальный набор параметров

ffmpeg 3.3+/libvpx 1.6.2+ позволяют использовать опцию -row-mt для лучшего распараллеливания процесса транскодинга (доступна в boram). См. описание.

Медленно кодируется VP9/используется только одно ядро

  1. Убедиться, что не выбран режим -quality best (good по умолчанию)

  2. Убедиться, что используется версия libvpx >= 1.4.0

  3. Убедиться, что присутствует ключ -threads 8 (или больше)

  4. -tile-columns >= 3 для 8 тредов (6 по умолчанию)

  5. -row-mt 1 (опционально)

Процессор всё ещё не полностью загружен при транскодинге в VP9

libvpx-vp9 использует tile-columns multithreading, поэтому число потоков энкодера зависит от разрешения видео. В общем случае число потоков считается как 2^floor(log2((w+63)/256)), где w — ширина итогового видео. Т.е.:

и т.д. При этом треды энкодера не обязательно будут загружать ядра на 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 (см. также раздел про субтитры).

Почему миниатюра чёрная/как сделать превью

Макаба использует первый кадр видео для генерации миниатюры, который в большинстве фильмов и клипов чёрный. Есть несколько способов получить адекватное превью:

Поддержка создания превью через 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-файлов в проводнике

Необходимо установить одну из нижеследующих программ:

Не работает/тормозит перемотка

В libvpx-vp9 по умолчанию нет ограничений на частоту появления ключевых кадров (что экономит битрейт), поэтому в видео с редкими сменами сцен их может быть слишком мало, что делает перемотку неудобной (эффективная смена позиции в видео возможна только по границам ключевых кадров). Если быстрая перемотка важнее итогового размера, следуется использовать ключ -g. Например, при -g 120 и видео 24 fps, ключевые кадры будут появляеться не реже, чем каждые 5 секунд.

UPDATE: В libvpx 1.6.0 значение по умолчанию для kf_max_dist установлено в 128, см. [1], [2]

Как прикрепить субтитры

Браузеры не поддерживают встроенный софтсаб (только внешние сабы через тег <track>), поэтому единственный вариант, не требующий специальной поддержки со стороны сайта, — хардсаб.

Настройки ресайза

Фильтр Mitchell-Netravali (-param0 1/3 -param1 1/3) обеспечивает минимальное количество артефактов ресемплинга, при этом облегчая энкодеру задачу, — фильтры типа Lanczos сохраняют слишком много деталей, которые трудно сжимать. См. также:

cubic_survey.gif

Как вырезать участок видео без перекодирования

Любое видео должно начинаться с ключевого кадра, поэтому при обрезке фрагмента через -c copy, значение ключа -ss обязано указывать на ключевой кадр с точностью хотя бы до миллисекунды. Заканчиваться же видео может в произвольном месте (на произвольном кадре). Команда в общем случае выглядит так: ffmpeg -i in.webm -ss ??.??? -t ?? -c copy out.webm

Способы узнать метки времени ключевых кадров:

Или же можно использовать специализированный софт: wybm (webm), VidCutter (все форматы, нет подсветки ключевых кадров), LosslessCut (mp4/webm/ogg, нет подсветки ключевых кадров), avidemux (все форматы).

Разрезать видео на части

mkvmerge --split ??m -o out.webm in.webm

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

Склеить видео из нескольких частей

file '/path/to/1.webm'
file '/path/to/2.webm'
file '/path/to/3.webm'

Подробнее. Внимание: звуковые дорожки использующие VBR в общем случаев склеивать без пережатия некорректно. Например, Firefox может отказаться проигрывать WebM-файл, полученный из двух других с аудиотреками в формате Opus.

Почему WebM for Retards …

60fps

Искусственное повышение частоты кадров можно считать не более, чем модной игрушкой. В большинстве случаев блендинг/интерполяция дают на выходе много артефактов, а полезность операции остаётся под вопросом. Тем не менее, ниже приведены ссылки на программы и документацию, посвящённые этому вопросу:

Захват видео с экрана

Несколько советов:

Как сделать прозрачное видео

Последние версии 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: метаданные

  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 можно подкрутить в зависимости от исходника).

Плюсы: результат должен выглядеть везде более-менее одинаково.

Сконвертировать множество видео за один раз

Задача: сконвертировать все mp4 файлы из текущего каталога в формат WebM.

Задача: сконвертировать все файлы из каталога in в каталог out в формат WebM, сохраняя структуру.

Удалить метаданные

ffmpeg -i in.webm -c copy -map_metadata -1 out.webm

Скачать с YouTube/прочего стриминг-сайта

Бесплатные видеоредакторы

Простые редакторы (cut, crop):

Полнофункциональные:

Обзор редакторов.

Бесплатные аудиоредакторы

Прочие ссылки