webm/s

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

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

Contents

  1. Часто задаваемые вопросы WebM-треда в /s/
    1. Почему консоль
    2. Какую обёртку FFmpeg использовать
    3. Рекомендуемый минимальный набор параметров
    4. Медленно кодируется VP9/используется только одно ядро
    5. Процессор всё ещё не полностью загружен при транскодинге в VP9
    6. VBR не попадает в лимит
    7. VBR vs. CRF
    8. При использовании ключа -ss энкодинг начинается не сразу/ключ -to работает некорректно
    9. Почему миниатюра чёрная/как сделать превью
    10. Превью не отображается/таб крэшится/зелёная полоса по краям/странные цвета
    11. Серый фон в нижней части видео/WebM не помещается в контейнер Макабы/растянутое превью
    12. Нет миниатюр у WebM-файлов в проводнике
    13. Не работает/тормозит перемотка
    14. Как прикрепить субтитры
    15. Настройки ресайза
    16. Как вырезать участок видео без перекодирования
    17. Разрезать видео на части
    18. Склеить видео из нескольких частей
    19. Почему WebM for Retards …
    20. 60fps
    21. Захват видео с экрана
    22. Как сделать прозрачное видео
    23. Как смотреть WebM в Edge
    24. Какой должна быть цветовая матрица
    25. Как кодировать HDR
    26. Сконвертировать множество видео за один раз
    27. Удалить метаданные
    28. Скачать с YouTube/прочего стриминг-сайта
    29. Бесплатные видеоредакторы
    30. Бесплатные аудиоредакторы
    31. Прочие ссылки

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

Преимущество 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):

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

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

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

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


webm/s (last edited 2017-05-04 08:31:48 by Kagami)