welcome: please sign in
location: Diff for "webm/s"
Differences between revisions 1 and 37 (spanning 36 versions)
Revision 1 as of 2015-12-19 18:46:11
Size: 483
Editor: anonymous
Comment:
Revision 37 as of 2015-12-20 12:06:20
Size: 16903
Editor: anonymous
Comment: tile-columns
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Частозадаваемые вопросы webm-треда в /s/ = = Часто задаваемые вопросы WebM-треда в /s/ =
Line 3: Line 3:
=== Почему консоль? === Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное.
Line 5: Line 5:
=== Медленно кодируется/используется только одно ядро === === Почему консоль ===
Line 7: Line 7:
=== Превью не отображается/видео не проигрывается/зелёная полоса по краям/кривые цвета === Преимущество FFmpeg состоит в том, что он предоставляет достаточно низкоуровневый доступ к процессу кодирования, обладая при этом огромным функционалом. Дело не в том, что консольный интерфейс чем-то лучше, а в возможности управлять каждым параметров энкодера, добиваясь максимально качественного результата. GUI, как правило, данной способности лишены и сильно ограничивают гибкость настройки. [[https://arhivach.org/thread/109411/#1396973|Развёрнутый ответ.]]

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

 * 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 [[http://permalink.gmane.org/gmane.comp.multimedia.webm.devel/2339|использует 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÷40, чтобы избежать undershoot
 * Для сложных сцен из фильмов {{{-qmin}}} в районе 15÷30 поможет от overshoot

Так или иначе, полностью промахов мимо лимита не избежать. Если промах больше 500 килобайт, лучше перекодировать видео со слегка изменёнными {{{-b:v/-qmin/-qmax}}}. Иначе можно перекодировать только аудио и перемуксить со старым видео, выйдет гораздо быстрее по времени (см. [[https://github.com/pituz/webm-thread/blob/master/tools/fit-audio-to-limit|скрипт]]). При совсем небольшом overshoot в районе десятков килобайт, перемуксить с помощью mkvmerge может быть достаточно (муксер mkvmerge чуть более эффективен, чем FFmpeg).

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

При использовании ключа {{{-ss}}} '''после''' {{{-i}}}, FFmpeg декодирует видео покадрово до указанного момента. Если опции {{{-ss}}} указана '''перед''' {{{-i}}}, будут использоваться ключевые кадры, что значительно ускорит процесс. Однако, ключ {{{-to}}} в таком случае начинает работать как {{{-t}}}. [[https://trac.ffmpeg.org/wiki/Seeking|Подробнее.]] Оптимальное решение: использовать {{{-ss}}} '''перед''' {{{-i}}}, '''не''' использовать {{{-to}}} (см. также раздел про субтитры).

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

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

 * В случае клипа часто достаточно убрать первые полсекунды ({{{-ss 0.5}}})
 * Можно воспользоваться хаком: добавить второй видео-трек с чуть большим разрешением; макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[https://github.com/pituz/webm-thread/blob/master/tools/add-preview|скрипт]], [[https://arhivach.org/storage/f/af/fafe9386aeb4dc80f976a0e9d4667977.webm|подробный видеоурок]])
 * [[https://github.com/pituz/webm-thread/wiki/Pro-tips#Добавление-превью|Устаревший способ с добавлением кадра в начало основного видео]]

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

Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt +yuv420p}}}

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

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

 * [[http://www.babelsoft.net/products.htm|Media Preview]] (Windows)
 * [[http://www.videohelp.com/software/Icaros|Icaros]] (Windows)
 * [[https://github.com/dirkvdb/ffmpegthumbnailer|ffmpegthumbnailer]] (Linux)
Line 10: Line 67:

Любое видео должно начинаться с ключевого кадра, поэтому при обрезке фрагмента через {{{-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}}} (необходимо собрать из [[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}}} (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео)

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

В libvpx-vp9 по умолчанию нет ограничений на частоту появления ключевых кадров ([[https://arhivach.org/thread/120883/#1496522|что экономит битрейт]]), поэтому в видео с редкими сменами сцен их может быть слишком мало, что делает перемотку неудобной (эффективная смена позиции в видео возможна только по границам ключевых кадров). Если быстрая перемотка важнее итогового размера, следуется использовать ключ {{{-g}}}. Например, при {{{-g 120}}} и видео 24 fps, ключевые кадры будут появляеться не реже, чем каждые 5 секунд.

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

Браузеры не поддерживают софтсаб в формате WebVTT, поэтому единственный переносимый вариант — хардсаб.

 * Базовый синтаксис: {{{-vf "subtitles=sub.ass"}}} (работает и с файлами типа mkv, mp4)
 * Для хардсаба на Windows необходимо предварительно [[https://github.com/pituz/webm-thread/wiki/fontconfig-on-windows|настроить Fontconfig]]
 * Если в используемой команде FFmpeg ключ {{{-ss}}} стоит '''перед''' {{{-i}}}, требуется добавить фильтр {{{setpts}}} со сдвигом на то же число секунд: {{{-vf "setpts=PTS+??/TB,subtitles=sub.ass,setpts=PTS-STARTPTS"}}} ([[https://trac.ffmpeg.org/ticket/2067|баг]])
 * Если в файле несколько треков с субтитрами, выбрать нужный можно с помощью опции {{{si}}}, например: {{{-vf "subtitles=in.mkv:si=1"}}} (выберет второй трек с субтитрами; индекс относительный и начинается с нуля)
 * [[https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping|Правила экранирования специальных символов]] (проще переименовать файл)
 * На Windows при указании полного пути до файла с субтитрами, следует использовать синтаксис: {{{-vf "subtitles=C\\:/dir/sub.ass"}}} (проще переместить в текущий каталог)

=== Рекомендуемые настройки ресайза ===

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

 * https://arhivach.org/thread/120883/#1496241
 * http://avisynth.nl/index.php/Resize#LanczosResize
 * http://www.imagemagick.org/Usage/filter/
 * http://www.imagemagick.org/Usage/filter/nicolas/

{{attachment:cubic_survey.gif}}

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

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

Фрагменты могут иметь чуть больший итоговый размер в силу особенностей работы mkvmerge. Скрипт, который делит файл на части строго не больше указанного размера, доступен по [[https://github.com/pituz/webm-thread/blob/master/tools/mkvsplit|ссылке]].

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

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

 * [[http://fixounet.free.fr/avidemux/|avidemux]]
 * [[http://www.virtualdub.org/|VirtualDub]] (Windows only)
 * [[https://mpv.io/|mpv]] + юзер-скрипт типа [[https://github.com/Kagami/mpv_slicing|slicing.lua]]

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

 * [[https://www.blender.org/|Blender]]
 * [[http://www.shotcut.org/|Shotcut]]
 * [[https://kdenlive.org/|Kdenlive]] (Linux only)

=== VBR vs CRF ===

В [[https://arhivach.org/thread/109411/#1434939|некоторых случаях]] 2pass CRF выдаёт чуть лучшее качество, чем 2pass VBR, при том же размере файла. Поэтому на низких битрейтах может иметь смысл подогнать значение ключа {{{-crf}}} под требуемый размер файла. Например: {{{-b:v 0 -crf 30}}}

=== Онлайн-утилиты ===

Нативные программы обеспечивают максимальный контроль за процессом кодирования, однако не всегда есть возможность их использовать. Ниже приведены некоторые полезные онлайн-сервисы:

 * [[http://keepvid.com/|Скачать видео с ютуба]]
 * [[https://kagami.github.io/webm.js/|Конвертер 1]]
 * [[http://video.online-convert.com/convert-to-webm|Конвертер 2]]
 * [[http://convert-video-online.com/|Конвертер 3]] + [[http://online-video-cutter.com/|Cutter]] (требует флеш)

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

 * [[https://trac.ffmpeg.org/wiki/Capture/Desktop|Захват видео с экрана]]
 * [[https://arhivach.org/thread/120883/#1478504|WebM с ютуба без перекодирования]]
 * [[https://arhivach.org/thread/120883/#1482277|Оптимальные параметры кодирования статичной картинки]]
 * [[https://arhivach.org/thread/120883/#1477181|Кодирование GIF]]
 * [[https://arhivach.org/thread/109411/#1434421|Сохранение качества картинки на низких битрейтах]]
 * [[https://arhivach.org/thread/109411/#1426151|О состоянии дел с WebM в браузерах]]
 * [[https://arhivach.org/thread/120883/#1467208|Какие цветовые матрицы использовать]]

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

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

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

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

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

  • 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÷40, чтобы избежать undershoot

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

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

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

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

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

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

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

Вероятнее всего была использована плохо поддерживаемая цветовая субдискретизация. Следует перекодировать видео с опцией -pix_fmt +yuv420p

Нет миниатюр у 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 (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео)

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

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

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

Браузеры не поддерживают софтсаб в формате WebVTT, поэтому единственный переносимый вариант — хардсаб.

  • Базовый синтаксис: -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. Скрипт, который делит файл на части строго не больше указанного размера, доступен по ссылке.

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

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

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

VBR vs CRF

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

Онлайн-утилиты

Нативные программы обеспечивают максимальный контроль за процессом кодирования, однако не всегда есть возможность их использовать. Ниже приведены некоторые полезные онлайн-сервисы:

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

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