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 и level, но ничто не помогло мне получить постоянный битрейт видео 30000 Мбит.

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

1 ответ1

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .