FFmpeg, кодирование видео для воспроизведения 720p @ 4mbps

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

Что мне нужно (или, по крайней мере, я думаю, что мне нужно), так это рассчитать битрейт для определения скорости передачи в Мбит/с, если она превышает мои требования (720p @ 4 Мбит/с), то я хочу оптимизировать видео, если она ниже моих требований, то это просто вопрос копирования файла в контейнер mp4.

Теперь у меня есть собственный код для FFmpeg, который я прикреплю ниже, и я обнаружил, что есть альтернативные приложения, которые предоставят мне kbps, рассчитанные из файла, но я хочу сделать как можно больше всего этого только с одним приложением, если Я могу.

Я не прошу никого что-либо здесь кодировать, но более того, чтобы рассказать мне, как я могу рассчитать это самостоятельно, используя информацию, которую я получаю от FFmpeg или даже FFprobe, и какие параметры мне нужно установить в FFmpeg, чтобы убедиться, что видеофайл закодирован для потоковой передачи со скоростью 4 Мбит/с.

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -r 30 -profile:v Main -level:v 4.0 -crf 19 -c:a:0 copy -b:a:0 448k -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

Заранее спасибо.

Обновите мой исходный код

Этот новый код включает в себя битрейт buffsize и maxrate (при необходимости), в моем скрипте, если fps больше 30, он будет установлен на 30, в противном случае он был оставлен в покое, но если fps не определен, например 23,970542342, это может привести к ошибка в FFmpeg, я думал, что "-r 23.97" исправит это, но, видимо, нет, поэтому мне пришлось изменить "-r" на "-filter:v fps=" и установить частоту кадров для моих файлов, вычислив "r_frame_rate" , что достаточно легко.

Мой новый код

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -filter:v fps=30 -profile:v Main -level:v 4.0 -crf 18 -b:v 4000k -bufsize 4000k -maxrate:v 4000k -metadata title="" -metadata year="" -c:a:0 copy -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

В скрипте, который я создаю, он будет генерировать соответствующие параметры для FFmpeg, поэтому, если кодек не x264, если профиль: v не основной, если уровень: v не 4.0, если бит_рейт больше 4000k, тогда все необходимые параметры будут установлены, иначе он будет скопирован.

Код FFprobe от Mulvya, слегка модифицированный, чтобы я мог получить от него все, что мне нужно.

ffprobe -v error -select_streams v -show_entries stream="bit_rate,codec_name,profile,level,r_frame_rate" -of compact=p=0:nk=1 "input.file"

В конце концов, цель состоит в том, чтобы иметь свой собственный скрипт автоматизации для кодирования моих видео из папки, я знаю об автоматизаторе mp4 Sickbeard, но мне не нужны все эти функции, и есть вещи, которых я хочу, которых у него нет. .

Ответы (1)

Команда ffprobe ниже выдаст битрейт:

ffprobe in.mp4 -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1

например

4118620

Если результат больше, чем 4000000тогда, вы можете добавить -b:v 4000k -bufsize 4000k -maxrate:v 4000k. Или вы можете добавить его в любом случае. Установите -c:v, copyесли поток находится под 4000000else to libx264. Три значения будут игнорироваться, как и -b:a:0 448kв вашей команде.

Спасибо, @Mulvya, битовая скорость меня немного смутила, поэтому я предполагаю, что битовая скорость - это биты в секунду? и 4000000 = 4 Мбит/с?, я проверю это и вернусь как можно скорее. Команда "-b:a:0 448k" и даже "-b:a:1 160k" не игнорируется, когда я запускаю свой текущий скрипт, если я должен выводить информацию, оба аудиопотока отображают то, что я установил , что касается бит_рейта, я не думал просто сравнивать его с общим бит_рейтом, я думал, что это нечто большее, чем это, лол.
Когда для потока c:aзадано значение , он инертен, так как кодирование не выполняется. copyb:a
Ах да, я взглянул на файлы, в которых уже был звук 448k, поэтому понятно, почему он всегда был таким же, как у меня на выходе, лол. Просто быстрое размышление и последний вопрос, лол, могу ли я просто использовать "-maxrate:v" во время кодирования, чтобы убедиться, что оно не превышает моих требований? или было бы более практично включить "-b:v" и "-buffsize"?
Если -b:vне задано, то используется значение по умолчанию (200k), или в случае x264 вместо таргетинга битрейта используется режим CRF.