welcome: please sign in
location: Diff for "webm/s"
Differences between revisions 97 and 98
Revision 97 as of 2016-01-24 23:24:25
Size: 27368
Editor: anonymous
Comment: colormatrix
Revision 98 as of 2016-01-24 23:33:28
Size: 27408
Editor: anonymous
Comment: sar
Deletions are marked like this. Additions are marked like this.
Line 83: Line 83:
Макаба не поддерживает неквадратные пиксели при отображения вебм и считает разрешение видео равным разрешению, заявленному в контейнере.

Пример: допустим, имеется видео со следующими метаданными: ''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. ''// TODO: как именно?''
Макаба не поддерживает неквадратные пиксели и использует значения 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. ''// TODO: как именно?''

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

Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне webm-thread wiki. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное.

Contents

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

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

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

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

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

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

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

  • 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/используется только одно ядро

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

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

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

Процессор всё ещё не полностью загружен при транскодинге в 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, ровно как и разделение видео на независимые части, приводит к некоторому ухудшению качества итогового видео.

VBR не попадает в лимит

Rate control в libvpx-vp9 ещё далёк от совершенства. Есть несколько способов уменьшить его огрехи:

  • Для несложных исходников вроде анимации имеет смысл выставить -qmax в районе 30÷35, чтобы избежать undershoot (или использовать CRF, например: -b:v 0 -crf 25)

  • Для сложных сцен из фильмов -qmin в районе 15÷20 поможет от overshoot

Так или иначе, полностью промахов мимо лимита не избежать. Если промах больше 500 килобайт, лучше перекодировать видео со слегка изменёнными -b:v/-qmin/-qmax. Иначе можно перекодировать только аудио и перемуксить со старым видео, выйдет гораздо быстрее по времени (см. скрипт). При совсем небольшом overshoot в районе десятков килобайт, перемуксить с помощью mkvmerge может быть достаточно (муксер mkvmerge чуть более эффективен, чем FFmpeg). Ещё один вариант — обрезать пару секунд с конца (-c copy -t ??), если исходный хронометраж не критичен.

При использовании ключа -ss энкодинг начинается не сразу/ключ -to работает некорректно

При использовании ключа -ss после -i, FFmpeg декодирует видео покадрово до указанного момента. Если опции -ss указана перед -i, будут использоваться ключевые кадры, что значительно ускорит процесс. Однако, ключ -to в таком случае начинает работать как -t. Подробнее. Оптимальное решение: использовать -ss перед -i, не использовать -to (см. также раздел про субтитры).

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

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

Поддержка создания превью через GUI также есть в wybm.

Превью не отображается/таб крэшится/зелёная полоса по краям/странные цвета

Вероятнее всего была использована плохо поддерживаемая цветовая субдискретизация. Следует перекодировать видео с опцией -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. // TODO: как именно?

Нет миниатюр у WebM-файлов в проводнике

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

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

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

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

  • В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (поддерживает любые форматы, но шаг перемотки может быть слишком большим)
  • mkvinfo -v in.webm | grep 'key, track number 1' (при условии, что видео идёт первым треком; поддерживает форматы Matroska, WebM)

  • webm_info -i in.webm -all | grep key:1 (необходимо собрать из исходников; поддерживает формат WebM)

  • ffprobe -v quiet -show_frames -select_streams v -of compact in.webm | grep key_frame=1 (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео)

Или же можно использовать специализированную программу wybm.

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

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

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

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

  • Базовый синтаксис: -vf "subtitles=sub.ass" (работает и с файлами типа mkv, mp4)

  • Для хардсаба на Windows необходимо предварительно настроить Fontconfig

  • Если в используемой команде 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 сохраняют слишком много деталей, которые трудно сжимать. См. также:

cubic_survey.gif

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

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'
  • Если в файлах используются разные кодеки, необходимо пережатие: 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, не всегда допустимо склеивать без пережатия.

60fps

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

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

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

  • Если нужно получить видео в формате WebM, то лучше всего захватывать как H.264 lossless/WAV (см. ссылки выше), а затем пережимать в VP9/Opus двумя проходами
  • По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию -pix_fmt +yuv420p

  • При использовании цветовой модели YCbCr (основная для большинства форматов), полученное видео будет иметь цветовую матрицу BT.601 (дефолтная для FFmpeg), поэтому результирующую WebM лучше соответствующим образом промаркировать (-colorspace bt470bg)

  • При захвате звука с ALSA на входе желательно указывать параметры -rtbufsize 1M -thread_queue_size 64, иначе возможны переполнения буфера и разрывы аудиодорожки

Какие цветовые матрицы использовать

По состоянию на январь 2016, Firefox до сих пор использует только цветовую матрицу BT.601 при преобразовании YCbCr в RGB. Поэтому для одинакового и корректного отображения цветов во всех видах проигрывателей требуется конвертировать исходное видео в 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.

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

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

  • Linux (Bash): ls *.mp4 | while read f; do ffmpeg -i "$f" "${f%.*}.webm"; done

  • Windows (PowerShell): ls *.mp4 | % { ffmpeg -i $_.name "$($_.basename).webm" } 

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

  • Linux (Bash): find in -type f | while read f; do mkdir -p "out/${f%/*}" && ffmpeg -i "$f" "out/${f%.*}.webm"; done

  • 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/прочего стриминг-сайта

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

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

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

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

VBR vs. CRF

В некоторых случаях 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа -crf под требуемый размер файла. Например: -b:v 0 -crf 50

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

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