Я проверяю преобразование некоторых видео к HEVC, кодирующему использующий ffmpeg и libx265, и я обнаружил, что входная ширина должна быть делимой 8, чтобы успешно повторно закодировать. Я хотел бы определить, будет ли повторно кодирование успешно, не делая попытку кодирования и затем исследуя вывод. Идеально я хотел бы сделать это в сценарии удара. Мои навыки несколько ограничены в этом отношении и большая часть того, что я придумал, к настоящему времени намного менее, чем изящно.
Например, я знаю, что могу сделать математику с до н.э как в:
echo 'scale=2;576/8' | bc
72.00
и я могу получить ширину через
width=$(mediainfo $filename | grep "Width" | sed 's/[^0-9]*//g')
но первый точно не отвечает на вопрос, ширина, делимая 8, и последний уродлив и использует слишком много каналов, на которые указывает исследование, меньше затем эффективно.
У меня есть ffmpeg командная строка для перекодирования, отсортированного к моему использованию удовлетворенности:
ffmpeg -i "$f" -c:a copy -c:v libx265 -preset "$preset" -crf 25 "$target"
и я намереваюсь масштабировать видео к ширине, делимой 8, если это уже не, но я ищу лучшие решения, чем я придумал к настоящему времени для определения, если масштабирование требуется и как определить самую близкую ширину, делимую 8 для масштабирования к.
Следующее исправит ширина к числу, делимому 8 и затем правильно перемасштаб высота к числу, делимому 8 при поддержании корректного соотношения сторон:
ffmpeg -i <input> \
-c:a copy \
-c:v libx265 -preset medium -x265-params crf=28 \
-vf scale="trunc(iw/8)*8:-8" \
<output>
В качестве награды, если ширина является уже делимой 8, не будет никакого изменения в выходной ширине и никакой ошибки от FFmpeg.
объяснение синтаксиса масштаба, помня, что синтаксис -vf scale=width:height
:
1. Выходной Расчет Ширины:
iw/8
: ширина входного видеопотока будет разделена на 8. Таким образом, исходная ширина 690 создала бы номер 86.25 trunc
: номер 86.25 был бы 'усеченным' к 86 *8
: 86 был бы умножен на 8 для предоставления конечной ширины 688, который, конечно, является делимым 8! 2. Выходной Расчет Высоты:
-8
: FFmpeg вычислит высоту, которая является делимой 8, но которая также поддерживает корректное соотношение сторон исходного файла В идеальном мире hevc, кодирование выполняется с кодированием единиц 8x8, 16x16, 32x32 и т.д., и этот синтаксис гарантирует это. Больше деталей этого здесь...
Ссылки:
Получение ширины относительно просто с mediainfo
. Если у Вас нет его, можно установить его с sudo apt-get install mediainfo
width=$(mediainfo '--Inform=Video;%Width%' $filename)
Определение делимости 8 может быть сделано через
if [ $(( $width % 8 )) -eq 0 ] ; then
echo "Your number is divisible by 8 – you may convert it”
else
echo "Video width is not divisible by 8 – it needs scaling to re-encode it."
fi
Намного более простой и более быстрый подход, вдохновленный @andrew.46 и немного большим количеством исследования и тестирования, должен позволить ffmpeg сделать работу с
ffmpeg -i $inputfilename -c:a copy -c:v libx265 -preset veryfast -x265-params crf=25 -vf scale=-8:ih $outputfilename
-vf scale=-8:ih
установка обеспечивает, чтобы ширина была делимой 8 (-8) и использовала входную высоту (ih) соответственно для поддержания соотношения сторон.
Источники: man mediainfo
https://stackoverflow.com/questions/7376477/geting-video-information-from-mediainfo
Как я могу определить, может ли видео быть закодировано успешно с HEVC (x265) кодирование