= Часто задаваемые вопросы WebM-треда в /s/ = Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное. === Почему консоль === Преимущество 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 1/2 -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 1/2 -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 1/2 -y out.webm}}} === Медленно кодируется VP9/используется только одно ядро === 1. Убедиться, что присутствует ключ {{{-threads 8}}} (или больше) 2. Убедиться, что используется версия {{{libvpx >= 1.4.0}}} === Процессор всё ещё не полностью загружен при транскодинге в 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}}}), склеивая полученные файлы на уровне демуксера. === 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) === Как вырезать участок видео без перекодирования === Любое видео должно начинаться с ключевого кадра, поэтому при обрезке фрагмента через {{{-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+123/TB,subtitles=sub.ass,setpts=PTS-STARTPTS"}}} ([[https://trac.ffmpeg.org/ticket/2067|баг]]) * Если в файле несколько треков с субтитрами, выбрать нужный можно с помощью опции {{{si}}}, например: {{{-vf "subtitles=video.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 === В [[http://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|Сохранение качества картинки на низких битрейтах]]