welcome: please sign in
location: Diff for "webm/s"
Differences between revisions 84 and 151 (spanning 67 versions)
Revision 84 as of 2016-01-24 14:55:33
Size: 25395
Editor: anonymous
Comment: guides
Revision 151 as of 2017-01-13 10:48:22
Size: 30127
Editor: anonymous
Comment: add-netflix
Deletions are marked like this. Additions are marked like this.
Line 17: Line 17:
 * Windows: [[https://gitgud.io/nixx/WebMConverter|WebMConverter]]
 * Linux: [[https://pypi.python.org/pypi/webm|webm.py]] (CLI), [[https://github.com/pituz/webm-thread/blob/master/tools/WebMaster|WebMaster]] (CLI), [[https://qwinff.github.io/|QWinFF]] (GUI)

[[https://github.com/Kagami/webm.py/wiki/Related-links|Полный список.]]
 * Мультиплатформа: [[../boram|boram]]
 * Windows: [[https://gitgud.io/nixx/WebMConverter|WebM for Retards]], [[http://www.xmedia-recode.de/|XMedia Recode]] (nonfree)
 * Linux: [[https://pypi.python.org/pypi/webm|webm.py]], [[https://github.com/pituz/webm-thread/blob/master/tools/WebMaster|WebMaster]]

[[https://github.com/Kagami/webm.py/wiki/Related-links#webm-tools|Полный список.]] [[https://github.com/Kagami/webm.py/wiki/Related-links#online|Онлайн-конвертеры.]]
Line 25: Line 26:
 * 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, умеренное качество, приемлемая скорость: {{{ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -threads 8 -g 9999 -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 -g 9999 -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 -lag-in-frames 25 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm}}}
Line 32: Line 33:
 1. Убедиться, что присутствует ключ {{{-threads 8}}} (или больше)  1. Убедиться, что '''не''' выбран режим {{{-quality best}}} (good по умолчанию)
Line 34: Line 35:
 3. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию)  3. Убедиться, что присутствует ключ {{{-threads 8}}} (или больше)
 4
. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию)
Line 70: Line 72:
 * Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[https://github.com/pituz/webm-thread/blob/master/tools/add-preview|скрипт]], [[https://dump.bitcheese.net/files/izufyre/preview-guide.webm|подробный видеоурок]])  * Можно воспользоваться хаком: кодировать кадр превью в виде второго видео-трека с большим разрешением; макаба использует его для миниатюры, браузеры же будут проигрывать только первый трек ([[https://github.com/pituz/webm-thread/blob/master/tools/add-preview|скрипт]], [[https://hive.blasux.ru/webm/s?action=AttachFile&do=get&target=preview-guide.webm|видеоурок]])
Line 78: Line 80:
Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt +yuv420p}}} Вероятнее всего была использована плохо поддерживаемая [[https://en.wikipedia.org/wiki/Chroma_subsampling|цветовая субдискретизация]]. Следует перекодировать видео с опцией {{{-pix_fmt yuv420p}}}
Line 81: 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: как именно?''
== Серый фон в нижней части видео/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, либо при использовании разных аспектов для первого видео-трека и видео-трека превью, возможно искажение оригинальных пропорций последнего
.
Line 92: Line 96:
 * [[http://www.babelsoft.net/products.htm|Media Preview]] (Windows)
 * [[http://www.videohelp.com/software/Icaros|Icaros]] (Windows)
 * [[http://www.babelsoft.net/products/mediapreview.htm|Media Preview]] (Windows, nonfree)
 * [[http://www.videohelp.com/software/Icaros|Icaros]] (Windows, nonfree)
Line 95: Line 99:

<<Anchor(cut)>>
== Как вырезать участок видео без перекодирования ==

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

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

'''UPDATE:''' В libvpx 1.6.0 значение по умолчанию для {{{kf_max_dist}}} установлено в 128, см. [[http://permalink.gmane.org/gmane.comp.multimedia.webm.devel/2587|[1] ]], [[https://chromium.googlesource.com/webm/libvpx/+/14828e756f92175c1a3c097c1048c01bbfba43a9%5E!/|[2] ]]
Line 118: Line 110:
Браузеры не поддерживают софтсаб в формате WebVTT, поэтому единственный переносимый вариант — хардсаб. Браузеры не поддерживают встроенный софтсаб (только внешние сабы через тег [[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track|<track>]]), поэтому единственный вариант, не требующий специальной поддержки со стороны сайта, — хардсаб.
Line 128: Line 120:
== Рекомендуемые настройки ресайза ==

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

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

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

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

 * В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (поддерживает любые форматы, шаг перемотки (по умолчанию 5 секунд) можно изменить в настройках)
 * {{{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}}} (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео)
 * '''TODO:''' ffprobe -show_packets?

Или же можно использовать специализированный софт: [[../wybm|wybm]] (только WebM), [[http://avidemux.sourceforge.net/|avidemux]] (любые форматы, но программа глючная), [[https://github.com/mifi/lossless-cut|LosslessCut]] (любые форматы, но обрезка неточная, т.к. программа не подсвечивает ключевые кадры).
Line 150: Line 157:
 * Если файлы имеют расширения mkv, webm, mp4, avi и '''одинаковые кодеки''': {{{ffmpeg -f concat -i list.txt -c copy out.webm}}}, предварительно создав файл {{{list.txt}}} с содержимым:  * Если файлы имеют расширения mkv, webm, mp4, avi и '''одинаковые форматы''': {{{ffmpeg -f concat -i list.txt -c copy out.webm}}}, предварительно создав файл {{{list.txt}}} с содержимым:
Line 156: Line 163:
 * Если в файлах используются '''разные кодеки''', необходимо пережатие: {{{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}}}

[[https://trac.ffmpeg.org/wiki/Concatenate|Подробнее.]] '''Внимание:''' звуковые дорожки, особенно VBR, не всегда допустимо склеивать без пережатия.
 * Если в файлах используются '''разные форматы''', необходимо пережатие: {{{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}}}

[[https://trac.ffmpeg.org/wiki/Concatenate|Подробнее.]] '''Внимание:''' звуковые дорожки использующие VBR в общем случаев склеивать без пережатия некорректно. Например, Firefox может отказаться проигрывать WebM-файл, полученный из двух других с аудиотреками в формате Opus.

<<Anchor(webmfr)>>
== Почему WebM for Retards … ==

 * … кодирует короткое видео чуть ли не сутки: нужно у
брать опцию {{{-quality best}}} из строки параметров
 * … обрезает исходное видео по длине: ну
жно убрать опцию {{{-fs ?}}} из строки параметров
Line 162: Line 175:
Искусственное повышение частоты кадров можно считать не более, чем модной игрушкой (простой аргумент: если это так легко, то почему релизеры медиапродукции этим не занимаются?). В большинстве случаев блендинг/интерполяция дают на выходе много артефактов, а полезность операции остаётся под вопросом. Тем не менее, ниже приведены ссылки на программы и документацию, посвящённые этому вопросу:

 * [[http://forum.ixbt.com/topic.cgi?id=60:2988|Огромная тема на ixbt]]
 * [[https://www.svp-team.com/wiki/Plugins:_SVPflow|Популярный плагин SVPflow]] (Windows only)
Искусственное повышение частоты кадров можно считать не более, чем модной игрушкой. В большинстве случаев блендинг/интерполяция дают на выходе много артефактов, а полезность операции остаётся под вопросом. Тем не менее, ниже приведены ссылки на программы и документацию, посвящённые этому вопросу:

 * [[http://forum.ixbt.com/topic.cgi?id=60:2988|Огромный тред на ixbt]]
Line 167: Line 179:
 * [[https://kaangenc.me/motion-interpolation-24-fps-to-60-fps-with-mpv-vapoursynth-and-mvtools.html|Интерполяция с помощью mpv, VapourSynth и MVTools]]
 * [[http://pastebin.com/kwtz9HhQ|Гайд по SVPFlow]]
 * [[https://dump.bitcheese.net/files/ypomona/hybrid-60fps.webm|Видеоурок по Hybrid]]
 * [[https://kaangenc.me/motion-interpolation-24-fps-to-60-fps-with-mpv-vapoursynth-and-mvtools.html|Интерполяция с помощью mpv, VapourSynth и MVTools]], [[https://gist.github.com/phiresky/4bfcfbbd05b3c2ed8645|альтернативный скрипт]]
 * [[https://dump.bitcheese.net/files/ypomona/hybrid-60fps.webm|Видеоурок по Hybrid]] (nonfree)
 * [[https://www.svp-team.com/wiki/Plugins:_SVPflow|Популярный плагин SVPflow]], [[http://pastebin.com/kwtz9HhQ|гайд]] (Windows only, nonfree)
Line 174: Line 186:
 * [[https://trac.ffmpeg.org/wiki/Capture/Desktop|Захват видео]]
 * [[https://trac.ffmpeg.org/wiki/Capture/ALSA|Захват звука с ALSA]] (Linux only)
 * [[https://trac.ffmpeg.org/wiki/Capture/Desktop|Захват видео/аудио с помощью FFmpeg]]
 * [[https://trac.ffmpeg.org/wiki/Capture/ALSA|Захват звука с ALSA с помощью FFmpeg]] (Linux only)
Line 180: Line 192:
 * Если нужно получить видео в формате WebM, то лучше всего записывать в формате H.264 lossless/WAV (см. ссылки выше), а затем пережимать в VP9/Opus двумя проходами
 * При захвате звука с ALSA на входе желательно указывать параметры {{{-rtbufsize 1M -thread_queue_size 64}}}, иначе возможны переполнения буфера и разрывы аудиодорожки
 * При захвате с экрана в цветовой модели YCbCr (основная для большинства форматов), полученное видео будет иметь цветовую матрицу BT.601 (дефолтная для FFmpeg), поэтому результирующую WebM лучше соответствующим образом промаркировать ({{{-colorspace bt470bg}}})
 * Если нужно получить видео в формате WebM, то лучше всего захватывать как H.264 lossless/WAV (см. ссылки выше), а затем пережимать в VP9/Opus двумя проходами
 * При захвате звука, на входе желательно указывать параметры {{{-rtbufsize 1M -thread_queue_size 64}}}, иначе возможны переполнения буфера и разрывы аудиодорожки
 * По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию {{{-pix_fmt yuv420p}}}
 * При использовании
цветовой модели YCbCr (основная для большинства форматов), полученное видео будет иметь цветовую матрицу BT.601 (дефолтная для FFmpeg), поэтому результирующую WebM лучше соответствующим образом промаркировать ({{{-colorspace bt470bg}}})

<<Anchor(edge)>>
== Как смотреть WebM в Edge ==

Следует использовать [[https://github.com/Kagami/webmify|данный юзерскрипт]].
Line 185: Line 203:
== Какие цветовые матрицы использовать ==

По состоянию на январь 2016, Firefox до сих пор использует только цветовую матрицу BT.601 при конвертации YCbCr в RGB, поэтому самый переносимый вариант это использовать BT.601 для всех видео. [[https://arhivach.org/thread/120883/#1467208|Подробнее.]]
== Какой должна быть цветовая матрица ==

Предпочтительнее использовать BT.709 и соответстующим образом маркировать видео (опция {{{-colorspace bt709}}}). [[https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings#colormatrix|Подробности.]]

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

Плюсы: результат должен выглядеть везде более-менее одинаково.
Line 192: Line 227:
Задача: сконвертировать все mp4 файлы из текущего каталога в формат WebM.

 * Linux (Bash): {{{ls *.mp4 | while read f; do ffmpeg -i "$f" "${f%.*}.webm"; done}}}
'''Задача:''' сконвертировать все mp4 файлы из текущего каталога в формат WebM.

 * Linux (Bash): {{{for f in *.mp4; do ffmpeg -i "$f" "${f%.*}.webm"; done}}}
 * Linux (Z
sh): {{{for f in *.mp4; ffmpeg -i $f $f:r.webm }}}
Line 197: Line 233:
Задача: сконвертировать все файлы из каталога {{{in}}} в каталог {{{out}}} в формат WebM, сохраняя структуру.

 * Linux (Bash): {{{find in -type f | while read f; do mkdir -p "out/${f%/*}" && ffmpeg -i "$f" "out/${f%.*}.webm"; done}}}
'''Задача:''' сконвертировать все файлы из каталога {{{in}}} в каталог {{{out}}} в формат WebM, сохраняя структуру.

 * Linux (Bash): {{{find in -type f -print0 | while read -d $'\0' f; do mkdir -p "out/${f%/*}" && ffmpeg -nostdin -i "$f" "out/${f%.*}.webm"; done}}}
 * Linux (Zsh): {{{for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -i $f out/$f:r.webm}}}
Line 211: Line 248:
 * [[http://docs.livestreamer.io/|Livestreamer]] (CLI)
Line 212: Line 250:
 * [[https://www.4kdownload.com/products/product-videodownloader|4K Video Downloader]] (GUI)
 * [[https://mrs0m30n3.github.io/youtube-dl-gui/|youtube-dlG]] (GUI)
 * [[http://jdownloader.org/|JDownloader]] (GUI)
 * [[https://addons.mozilla.org/en-US/firefox/addon/complete-youtube-saver/|Complete YouTube Saver]] (Firefox addon)
Line 213: Line 255:
 * [[http://en.savefrom.net/|savefrom]] (online)
Line 217: Line 260:
Простые редакторы (cut, crop): '''Простые редакторы (cut, crop):'''
Line 221: Line 264:
 * [[https://mpv.io/|mpv]] + юзер-скрипт типа [[https://github.com/Kagami/mpv_slicing|slicing.lua]]

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

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

 * [[https://www.shotcut.org/|Shotcut]] ([[https://www.shotcut.org/bin/view/Shotcut/TutorialVideos|видеоуроки]])
Line 226: Line 269:
 * [[http://www.shotcut.org/|Shotcut]]
Line 228: Line 270:
 * [[http://cinelerra-cv.org/|Cinelerra]] (Linux only)

[[http://xmodulo.com/good-video-editing-software-linux.html|Обзор редакторов.]]
Line 232: Line 277:
 * [[http://audacityteam.org/|Audacity]]  * [[http://www.audacityteam.org/|Audacity]]
Line 236: Line 281:
== VBR vs CRF == == VBR vs. CRF ==
Line 240: Line 285:
<<Anchor(online)>>
== Онлайн-конвертеры ==

Нативные программы обеспечивают максимальный контроль за процессом кодирования, однако не всегда есть возможность их использовать. [[https://github.com/Kagami/webm.py/wiki/Related-links#online|Список.]]
См. также: [[https://www.youtube.com/watch?v=thvSyJN1vsA&t=25m45s|сравнения Netflix компрессии различных режимов libvpx-vp9]].
Line 249: Line 291:
 * [[https://arhivach.org/thread/120883/#1478504|WebM с ютуба без перекодирования]]  * [[https://arhivach.org/thread/120883/#1477181|Кодирование GIF]]
 * [[https://arhivach.org/thread/109411/#1434421|Сохранение качества видео на низких битрейтах]]
Line 251: Line 294:
 * [[https://arhivach.org/thread/120883/#1477181|Кодирование GIF]]
 * [[https://arhivach.org/thread/109411/#1434421|Сохранение качества картинки на низких битрейтах]]
Line 255: Line 296:


<<BR>>
<<Navigation(siblings)>>

Часто задаваемые вопросы 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. Почему WebM for Retards …
    19. 60fps
    20. Захват видео с экрана
    21. Как смотреть WebM в Edge
    22. Какой должна быть цветовая матрица
    23. Как кодировать HDR
    24. Сконвертировать множество видео за один раз
    25. Удалить метаданные
    26. Скачать с YouTube/прочего стриминг-сайта
    27. Бесплатные видеоредакторы
    28. Бесплатные аудиоредакторы
    29. VBR vs. CRF
    30. Прочие ссылки

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

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

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

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

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

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

  • VP9, умеренное качество, приемлемая скорость: ffmpeg -i in.mkv -c:v libvpx-vp9 -b:v ???k -threads 8 -g 9999 -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 -g 9999 -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 -lag-in-frames 25 -pix_fmt yuv420p -c:a libopus -b:a 64k -sn -pass ? -y out.webm

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

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

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

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

  4. -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: -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>), поэтому единственный вариант, не требующий специальной поддержки со стороны сайта, — хардсаб.

  • Базовый синтаксис: -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

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

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

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

  • В mpv открыть видео, нажать паузу и перемотать к нужному моменту с помощью стрелок; нажать на время в всплывающем меню OSC для отображения миллисекунд (поддерживает любые форматы, шаг перемотки (по умолчанию 5 секунд) можно изменить в настройках)
  • 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 (поддерживает любые форматы, но медленно, т.к. декодирует все кадры в видео)

  • TODO: ffprobe -show_packets?

Или же можно использовать специализированный софт: wybm (только WebM), avidemux (любые форматы, но программа глючная), LosslessCut (любые форматы, но обрезка неточная, т.к. программа не подсвечивает ключевые кадры).

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

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 в общем случаев склеивать без пережатия некорректно. Например, Firefox может отказаться проигрывать WebM-файл, полученный из двух других с аудиотреками в формате Opus.

Почему WebM for Retards …

  • … кодирует короткое видео чуть ли не сутки: нужно убрать опцию -quality best из строки параметров

  • … обрезает исходное видео по длине: нужно убрать опцию -fs ? из строки параметров

60fps

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

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

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

  • Если нужно получить видео в формате WebM, то лучше всего захватывать как H.264 lossless/WAV (см. ссылки выше), а затем пережимать в VP9/Opus двумя проходами
  • При захвате звука, на входе желательно указывать параметры -rtbufsize 1M -thread_queue_size 64, иначе возможны переполнения буфера и разрывы аудиодорожки

  • По умолчанию видео будет иметь цветовую субдискретизацию 4:4:4, которая плохо поддерживается браузерами; следует использовать опцию -pix_fmt yuv420p

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

Как смотреть 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.

  • Linux (Bash): for f in *.mp4; do ffmpeg -i "$f" "${f%.*}.webm"; done

  • Linux (Zsh): for f in *.mp4; ffmpeg -i $f $f:r.webm 

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

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

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

  • Linux (Zsh): for f in in/**/*(.); mkdir -p out/$f:h && ffmpeg -i $f out/$f:r.webm

  • 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

См. также: сравнения Netflix компрессии различных режимов libvpx-vp9.

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


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