welcome: please sign in
location: Diff for "webm/s"
Differences between revisions 5 and 78 (spanning 73 versions)
Revision 5 as of 2015-12-19 20:12:16
Size: 4844
Editor: anonymous
Comment:
Revision 78 as of 2016-01-24 13:36:28
Size: 22609
Editor: anonymous
Comment: contents
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
=== Почему консоль? ===



Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное.

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


=== Медленно кодируется VP9/используется только одно ядро ===
Данный FAQ подразумевает, что читающий владеет навыками работы с FFmpeg хотя бы на уровне [[https://github.com/pituz/webm-thread/wiki|webm-thread wiki]]. Все нижеследующие ключи относятся к FFmpeg, если не обозначено иное.

<<TableOfContents>>

<<Anchor(console)>>
== Почему консоль ==

Преимущество FFmpeg состоит в том, что он предоставляет достаточно низкоуровневый доступ к процессу кодирования, обладая при этом огромной функциональностью. Дело не в том, что консольный интерфейс чем-то лучше, а в возможности управлять каждым параметров энкодера, добиваясь максимально качественного результата. GUI, как правило, данной способности лишены и сильно ограничивают гибкость настройки. [[https://arhivach.org/thread/109411/#1396973|Развёрнутый ответ.]]

<<Anchor(wrappers)>>
== Какую обёртку FFmpeg использовать ==

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

 * 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|Полный список.]]

<<Anchor(template)>>
== Рекомендуемый минимальный набор параметров ==

 * 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}}}

<<Anchor(vp9-slow)>>
== Медленно кодируется VP9/используется только одно ядро ==
Line 16: Line 34:

=== Процессор всё ещё не полностью загружен при транскодинге в VP9 ===
 3. {{{-tile-columns >= 3}}} для 8 тредов (6 по умолчанию)

<<Anchor(vp9-threads)>>
== Процессор всё ещё не полностью загружен при транскодинге в VP9 ==
Line 27: Line 47:
и т.д. При этом треды энкодера не обязательно будут загружать ядра на 100% в силу ограничений алгоритмов распараллеливания. Если процессор изрядно простаивает, имеет смысл кодировать видео по частам в отдельных процессах FFmpeg (используя опции {{{-ss}}} и {{{-t}}}), склеивая полученные файлы на уровне демуксера.

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


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

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

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


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

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

=== Рекомендуемые настройки ресайза ===
и т.д. При этом треды энкодера не обязательно будут загружать ядра на 100% в силу ограничений алгоритмов распараллеливания. Если процессор изрядно простаивает, имеет смысл кодировать видео по частам в отдельных процессах FFmpeg, используя опции {{{-ss}}} и {{{-t}}} и склеивая полученные файлы на уровне демуксера. Опция {{{-tile-columns}}} (6 по умолчанию) указывает на максимальное число рекурсивных делений видео на колонки (реальное значение считается как {{{log2(threads)}}}). Следует отметить, что {{{-tile-columns > 0}}}, ровно как и разделение видео на независимые части, приводит к некоторому ухудшению качества итогового видео.

<<Anchor(vbr)>>
== VBR не попадает в лимит ==

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

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

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

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

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

<<Anchor(webm-preview)>>
== Почему миниатюра чёрная/как сделать превью ==

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

 * В случае клипа часто достаточно убрать первые полсекунды ({{{-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#Добавление-превью|Устаревший способ с добавлением кадра в начало основного видео]]

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

<<Anchor(pix-fmt)>>
== Превью не отображается/таб крэшится/зелёная полоса по краям/странные цвета ==

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

<<Anchor(file-preview)>>
== Нет миниатюр у 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)

<<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]].

<<Anchor(rewind)>>
== Не работает/тормозит перемотка ==

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

<<Anchor(subs)>>
== Как прикрепить субтитры ==

Браузеры не поддерживают софтсаб в формате 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"}}} (проще переместить в текущий каталог)

<<Anchor(resize)>>
== Рекомендуемые настройки ресайза ==
Line 54: Line 132:
=== VBR vs CRF ===

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

=== Ссылки на полезные обсуждения ===
<<Anchor(split)>>
== Разрезать видео на части ==

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

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

<<Anchor(concat)>>
== Склеить видео из нескольких частей ==

 * Если файлы имеют расширения 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}}}

[[https://trac.ffmpeg.org/wiki/Concatenate|Подробнее.]] '''Внимание:''' звуковые дорожки, особенно VBR, не всегда допустимо склеивать без пережатия.

<<Anchor(60fps)>>
== 60fps ==

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

 * [[http://forum.ixbt.com/topic.cgi?id=60:2988|Огромная тема на ixbt]]
 * [[https://www.svp-team.com/wiki/Plugins:_SVPflow|Популярный плагин SVPflow]] (Windows only)
 * [[https://ffmpeg.org/ffmpeg-filters.html#framerate|Фильтр для FFmpeg]]
 * [[https://kaangenc.me/motion-interpolation-24-fps-to-60-fps-with-mpv-vapoursynth-and-mvtools.html|Интерполяция с помощью mpv, VapourSynth и MVTools]]

<<Anchor(pack-convert)>>
== Сконвертировать множество видео за один раз ==

Задача: сконвертировать все 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" } }}}

<<Anchor(clear-meta)>>
== Удалить метаданные ==

{{{ffmpeg -i in.webm -c copy -map_metadata -1 out.webm}}}

<<Anchor(youtube)>>
== Скачать с YouTube/прочего стриминг-сайта ==

 * [[https://rg3.github.io/youtube-dl/|youtube-dl]] (CLI)
 * [[../wybm|wybm]] (GUI)
 * [[http://keepvid.com/|KeepVid]] (online)

<<Anchor(vedit)>>
== Бесплатные видеоредакторы ==

Простые редакторы (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]] ([[https://www.youtube.com/playlist?list=PLjyuVPBuorqIhlqZtoIvnAVQ3x18sNev4|видеоуроки]])
 * [[http://www.shotcut.org/|Shotcut]]
 * [[https://kdenlive.org/|Kdenlive]] (Linux only)

<<Anchor(aedit)>>
== Бесплатные аудиоредакторы ==

 * [[http://audacityteam.org/|Audacity]]
 * [[https://ardour.org/|Ardour]]

<<Anchor(vbr-crf)>>
== VBR vs CRF ==

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

<<Anchor(online)>>
== Онлайн-конвертеры ==

Нативные программы обеспечивают максимальный контроль за процессом кодирования, однако не всегда есть возможность их использовать. [[https://github.com/Kagami/webm.py/wiki/Related-links#online|Список.]]

<<Anchor(links)>>
== Прочие ссылки ==

 * [[https://github.com/Kagami/webm.py/wiki|Вики на английском по чуть более продвинутым вопросам]]
 * [[https://trac.ffmpeg.org/wiki/Capture/Desktop|Захват видео с экрана]]
 * [[https://arhivach.org/thread/120883/#1478504|WebM с ютуба без перекодирования]]
Line 62: Line 227:
 * [[https://arhivach.org/thread/109411/#1434421|Сохранение качества картинки на низких битрейтах]]
 * [[https://arhivach.org/thread/109411/#1426151|О состоянии дел с WebM в браузерах]]
 * [[https://arhivach.org/thread/120883/#1467208|Какие цветовые матрицы использовать]]
 * [[https://arhivach.org/thread/136981/#1549242|Мифы об энкодинге/декодинге на GPU]]

Часто задаваемые вопросы 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. Как вырезать участок видео без перекодирования
    12. Не работает/тормозит перемотка
    13. Как прикрепить субтитры
    14. Рекомендуемые настройки ресайза
    15. Разрезать видео на части
    16. Склеить видео из нескольких частей
    17. 60fps
    18. Сконвертировать множество видео за один раз
    19. Удалить метаданные
    20. Скачать с YouTube/прочего стриминг-сайта
    21. Бесплатные видеоредакторы
    22. Бесплатные аудиоредакторы
    23. VBR vs CRF
    24. Онлайн-конвертеры
    25. Прочие ссылки

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

Преимущество 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-файлов в проводнике

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

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

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

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

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

Склеить видео из нескольких частей

  • Если файлы имеют расширения 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

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

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

Задача: сконвертировать все 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)