Как я могу определить, может ли видео быть закодировано успешно с HEVC (x265) кодирование

Я проверяю преобразование некоторых видео к 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 для масштабирования к.

2
задан 30 March 2016 в 22:45

2 ответа

Следующее исправит ширина к числу, делимому 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 и т.д., и этот синтаксис гарантирует это. Больше деталей этого здесь...

Ссылки:

1
ответ дан 2 December 2019 в 03:48

Получение ширины относительно просто с 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

https://superuser.com/questions/49765/how-to-make-a-statement-that-checks-if-something-is-divisible-by-something-else

Как я могу определить, может ли видео быть закодировано успешно с HEVC (x265) кодирование

http://ffmpeg.org/ffmpeg-filters.html#scale

1
ответ дан 2 December 2019 в 03:48

Другие вопросы по тегам:

Похожие вопросы: