достижение постоянного битрейта видео с помощью ffmpeg

2

Мы используем ffmpeg и скрипт транскодирования для транскодирования и хотим создать несколько командных файлов, которые мы можем использовать для транскодирования.

Например, я использую параметр с именем, video_kbitи если я пишу в 30000, он должен достигать 30 Мбит. Конечно, если я использую в 6000качестве параметра, он также должен достигать 6 Мбит, поэтому у меня есть один скрипт, который достигает каждого битрейта видео, который я хочу.

Поскольку мои настройки сейчас, я достигаю только 18,1 Мбит. Только когда я использую 15000 в качестве параметра, я достигаю своей цели для постоянного битрейта видео 15 Мбит. Если я использую 8000 в качестве параметра, я получаю 10,1 МБит в результате. Таким образом, при 15000 я получаю более высокий битрейт, а при 15000 я получаю более низкий битрейт, чем хочу.

Мои настройки:

ffmpeg -threads "4" -i "$2"  -f mp4 -c:v libx264 -crf 1 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-acodec libfaac -ac 2 -ab ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -vf scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

И я использую эти параметры:

FC_PARAM_video_kbit = 30000
FC_PARAM_audio_kbit = 192
FC_PARAM_width = 1920
FC_PARAM_height = 1080

Я пытался использовать более высокий размер буфера profile:vи настройки уровня, но ничто не помогло мне получить постоянный битрейт видео 30000 Мбит.

Ребята, есть ли у вас какие-либо идеи или предложения для лучшего способа достижения моей цели?

Себастьян
источник

Ответы:

2

Установка CRF (режим постоянного качества ) и скорости передачи видео одновременно не имеет никакого смысла. Вы хотите любой из них, исключительно.

Для достижения фиксированной скорости передачи данных, необходимо установить minrate , maxrateи b:vк тому же значению. Ваш сценарий будет выглядеть примерно так (но в идеале вы также должны измениться bufsize):

ffmpeg -threads "4" -i "$2" -c:v libx264 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-minrate ${FC_PARAM_video_kbit}k -b:v ${FC_PARAM_video_kbit}k \
-c:a libfaac -ac 2 -b:a ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -filter:v scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

Но опять же, имеет ли это смысл? Вопрос в том, чего вам действительно нужно достичь. Редко имеет смысл форсировать высокую скорость передачи данных, когда она не обеспечивает лучшего визуального качества (и только большие размеры файлов). Желание 30 Мбит / с для видео x264 - даже если это HD-контент 1080p - кажется мне немного излишним. *

x264 отлично подходит для обеспечения действительно хорошего качества, если вы просто установите CRF достаточно низким. Все, что ниже 17 или 18, должно быть незаметным с точки зрения визуального искажения, а CRF 0 означает кодирование без потерь. Скорее установите CRF на значение, которое выглядит достаточно хорошим для вас, и не беспокойтесь о скорости передачи данных. На самом деле это опция типа «установил и забыл», которую можно применять к пакетам видео для получения схожего качества вывода.

Наконец, не забывайте, что если, скажем, секунда видео может быть сжата без потерь (то есть с CRF 0) всего в 10 Мбит, то установка скорости передачи в 30 Мбит / с не заставит эту часть видео фактически потреблять 30 Мбит. x264 не «создает» информацию только для того, чтобы раздуть вывод до запрошенной скорости передачи данных. Это останется на 10 Мбит.

* Если вы хотите архивировать или распространять видео для дальнейшей обработки, выберите промежуточный кодек, например ProRes или DNxHD.

slhck
источник
Прежде всего я хочу поблагодарить вас за быстрый ответ. Я спросил моего коллегу об этом, и мы знаем, что вы можете архивировать более высокие битрейты с помощью DNxHD и ProRes, но наша цель остается той же, что мы хотим достичь определенной целевой битрейта, поэтому, если наши клиенты хотят клип с 6 Мбит, они должны получить клип с постоянным битрейтом 6MBit. Некоторые предустановки должны быть достигнуты (например, разрешение экрана, контейнер кодеков, видео / аудио битрейт и т. Д.). Вот почему я спросил о способе достижения как минимум постоянного битрейта видео, с вашим решением я достигаю постоянного битрейта до 7 Мбит.
Себастьян
Понимаю. Дело в том, что x264 не был написан с большой поддержкой CBR. Максимальный битрейт, который вы можете получить, определяется тем, что дает вам CRF 0. Вы не можете искусственно получить более высокий битрейт, и это не приведет к лучшему качеству, поэтому, если вам нужен x264, единственное решение, которое я вижу, это сказать вашим клиентам, что более высокий битрейт может быть недоступен (что не является плохой вещью). хоть).
Slhck
Еще раз спасибо, и мы будем использовать опцию CRF 0 и использовать самый высокий битрейт, который может дать нам CRF 0.
Себастьян