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

18596
Robin

Я использую 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? Буду очень признателен за вашу помощь и руководство.

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

1 ответ на вопрос

13
Wyatt8740

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

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( ваша секунда). Если это все еще не достаточно низко, уменьшите maxrateи затем заново установите bufsizeсоответственно.

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

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

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

Не следует «устанавливать bufsize где-то между тем же, что и ваш максимальный (одна секунда) и половиной вашего максимума (2 секунды)», следует «устанавливать» bufsize где-то между тем же, что и ваш максимальный (одна секунда), и в два раза больше вашего максимума (2 секунд) Ely 9 лет назад 1
@ Или, думаю, ты прав. Моя будет делать это каждые полсекунды. Я исправлю это! Wyatt8740 9 лет назад 0
@ Wyatt8740 Извините, я был очень занят. Только один вопрос. Если я использую `crf`, то мне не нужно указывать` bitrate`, `buffsize` и` maxrate`? И если да, что является более эффективным (используйте `crf` или` bitrate`, `buffsize` и` maxrate`)? Robin 9 лет назад 0
@Robin Вы можете использовать bufsize и maxrate с crf. Помните, crf будет корректировать битрейт на лету, чтобы соответствовать определенному качеству, и если части видео очень сложные, битрейт будет сниматься до небес, и вы, вероятно, этого не хотите, так что лучше «поставить блокировку» с помощью bufsize и maxrate (но не слишком строгий, иначе видео будет выглядеть как дерьмо! :)) Ely 9 лет назад 0
@ Робин правильно, вам не нужно использовать crf с другими. Однако вы можете, если хотите ограничить это. crf пытается поддерживать постоянное качество - вы можете заставить его делать это в определенных пределах с помощью `bufsize` и` maxrate`. Тебе не нужен битрейт. Как сказал Эли, это будет лучше для потоковой передачи. Wyatt8740 9 лет назад 0
@ Wyatt8740 Хорошо. Я думаю, что я получаю это. Я только что видел этот [пост] (http://trac.ffmpeg.org/wiki/Encode/H.264#CRFwithmaximumbitrate). Как вы сказали, частота должна составлять от 1 до 2 секунд, но так как `-maxrate` равен 400k, а` -bufsize 'равен 1835k, результат равен 0,2. Что тут происходит? Robin 9 лет назад 0
@Robin Моя рекомендация была просто практическим правилом. В этом примере используется более агрессивный (и, вероятно, менее эффективный) уровень проверки. Он не допускает такого большого количества колебаний качества, как у меня - вы хотите дать ему возможность колебаться, но недостаточно, чтобы размер значительно отличался от минуты к минуте. Я бы порекомендовал правило 0.5, но это не значит, что это невозможно сделать другими способами. С некоторыми источниками видео, которые не сильно меняются (например, цветные полосы или фото), это может быть приемлемым. Но в любом случае я бы сделал ближе к 0,5, а если что-нибудь, подойду ближе к одной секунде, чем к понижению. Wyatt8740 9 лет назад 0

Похожие вопросы