Я боролся с этой дилеммой около недели или двух, и я изо всех сил пытался понять это из всего, что я мог найти через 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, но мне не нужны все эти функции, и есть вещи, которых я хочу, которых у него нет. .
Команда 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
если поток находится под 4000000
else to libx264
. Три значения будут игнорироваться, как и -b:a:0 448k
в вашей команде.
Райкор
Гьян
c:a
задано значение , он инертен, так как кодирование не выполняется.copy
b:a
Райкор
Гьян
-b:v
не задано, то используется значение по умолчанию (200k), или в случае x264 вместо таргетинга битрейта используется режим CRF.