Как учитывать битрейт, -maxrate и -bufsize видео для веб

13

Я использую ffmpeg для кодирования своих видео и загрузки их в Интернет. Я видел этот пост об использовании ffmpeg, но не совсем понял, как считать значения.

Предположим, у меня есть видео размером 70 МБ с продолжительностью 4 минуты. Как я считаю , что значение этих флагов: -b:v, -maxrateи -bufsizeдля этой команды?

ffmpeg -i input -codec:v libx264 -profile:v main -preset slow -b:v ? -maxrate ? -bufsize ? -vf "scale=720:trunc(ow/a/2)*2" -threads 0 -codec:a libfdk_aac -movflags +faststart output

Или есть какое-нибудь нормальное значение, как для crfзначений 19-24? Буду очень признателен за вашу помощь и руководство.

Робин
источник
Видеокодирование - это искусство, и есть сотни параметров для освоения. Обратите внимание, что двухпроходное кодирование обеспечит (намного) лучшее качество и сжатие в большинстве сценариев, чем игра с битрейтом. Обычно конечный размер и битрейт видео зависит главным образом от размера видео выхода. ffmpeg, как правило, достаточно умен, чтобы выбирать максимальную скорость и битрейт, если вы говорите, что видео остается одинаковым. Также обратите внимание, что создание видео шириной 480px достаточно хорошо в большинстве сценариев, и это сэкономит гораздо большую пропускную способность, чем при битрейте.
Горизонт
1
@earizon Я согласен, кодирование видео - это искусство, а 480 обычно достаточно хорошо. Однако мне также нравится иметь более высокое разрешение, потому что я больше не использую ЭЛТ с разрешением 640x480. Это определенно лучший способ уменьшить размеры, чем возиться с битрейтом, но опять же, мне нравятся варианты.
Wyatt8740

Ответы:

20

Это действительно зависит от вашей скорости загрузки.

bufsizeопределит, насколько религиозно ffmpeg поддерживает постоянный битрейт. Если вы установите значение bufsize64 КБ, согласно FFmpeg Wiki: Ограничение выходного битрейта , он будет рассчитывать свой текущий битрейт каждые 64 килобайта и корректироваться соответствующим образом. Меньшие размеры bufsizeмогут быть вредны для качества, поскольку они не позволяют достаточно места между проверками для x264, чтобы сделать внезапные изменения - вы получите блочность.

Если у вас maxrate640 кбит / с, а у вас bufsize64 кбит, тогда каждую десятую секунды x264 будет проверять. Это неоптимально - FFmpeg Wiki: кодирование для потоковых сайтов рекомендует запускать его каждые 1-2 секунды. Если это не имеет смысла, подумайте об этом как maxrate/ bufsize= частота проверок. Держите эту частоту от 1 до 2 секунд, как правило.

Если вы установите оба maxrateи bufsize, вы должны:

  • установите maxrateминимальную скорость загрузки (в примере ffmpeg wiki это 80% от общей скорости загрузки, но пробег может отличаться).
  • установить bufsizeгде-то между тем же, что и вы maxrate(одна секунда), и вдвое больше maxrate(2 секунды). Если это все еще не достаточно низко, уменьшите maxrateи затем установите заново bufsizeсоответственно.

Затем вам придется немного поиграть, но так как вы должны начать где-то, я просто начну с maxrate600к, что обычно было достаточно для меня, прежде чем я использовал crfдля всего.

Если вы хотите, вы можете попробовать уменьшить значения bufsize, например, каждые три или четыре секунды, просто чтобы посмотреть, как значение меняет внешний вид вашего вывода. Затем вы можете определить, насколько вы должны беспокоиться об этом для вашего видео.

На самом деле нормального значения не существует - что crfзначит оптимизировать вывод на основе того, что, по его мнению, является наилучшим размером буфера для поддержания любой установленной скорости. Он пытается сохранить как можно меньший размер файла при сохранении некоторого качества за счет случайных скачков.

Wyatt8740
источник
1
Не следует «устанавливать bufsize где-то между тем же, что и ваш максимальный (одна секунда) и половиной вашего максимума (2 секунды)», следует «устанавливать» bufsize где-то между тем же, что и ваш максимальный (одна секунда), и в два раза больше вашего максимума (2 секунд)
Эли
@ Или, думаю, ты прав. Моя будет делать это каждые полсекунды. Я исправлю это!
Wyatt8740 30.07.15
@ Wyatt8740 Извините, я был очень занят. Только один вопрос. Если я использую crf, то мне не нужно указывать bitrate, buffsizeа maxrate? И если да, то, что является более эффективным (использовать crfили bitrate, buffsizeи maxrate)?
Робин
@Robin Вы можете использовать bufsize и maxrate с crf. Помните, crf будет корректировать битрейт на лету, чтобы соответствовать определенному качеству, и если части видео очень сложные, битрейт будет сниматься до небес, и вы, вероятно, этого не хотите, так что лучше «поставить блокировку» с помощью bufsize и maxrate (но не слишком строгий, иначе видео будет выглядеть как дерьмо! :))
Ely
@ Робин правильно, вам не нужно использовать crf с другими. Однако вы можете, если хотите ограничить это. CRF пытается поддерживать постоянное качество - вы можете заставить его делать это в определенных пределах с помощью bufsizeи maxrate. Вам не нужно bitrate, хотя. Как сказал Эли, это будет лучше для потоковой передачи.
Wyatt8740