FFmpeg. Разжатие видео в avi.

07. августа 2018 ffmpeg 0

В предыдущей статье была рассмотрена конвертация (сжатие) видео в формат .webm, в этот раз рассмотрим обратную ситуацию — разжатие видео.

Порой случается странная необходимость нарезать ролик из видеофайлов в .mp4 с кодированием h264 (x264) и прочих вариантах с сильным сжатием. Проблема заключается в том, что видеоредактор, к примеру Blender, работает довольно медленно со сжатым видео, что доставляет существенные неудобства. Это решается разжатием видео в формат без сжатия или со слабым сжатием.
Разжимать будем средствами всё того же ffmpeg с использованием формата контейнера avi.

Рассмотрим несколько кодеков для разжатия.

Примечание:

Самостоятельно изучить параметры кодеков можно следующей командой:
ffmpeg -h encoder=mpeg4 -hide_banner

Показать информацию об указанном кодеке:
-h encoder=mpeg4

Скрыть лишнюю информацию о ffmpeg, оставляя только информацию о кодеке:
-hide_banner

 

  • rawvideo разжимает максимально (lossless) и файл получается очень объёмным. Особые дополнительные параметры отсутствуют.
    Разжать 24 мб (H265/HEVC) в ~9 гб? Не вопрос.
  • huffyuv разжимает в среднем в два с небольшим раза меньший объем , чем при использовании rawvideo. Особые дополнительные параметры отсутствуют.
    Разжал 24 мб (H265/HEVC) в ~3,7 Гб.
  • mpeg4 (FMP4) разжимает в объём в десятки раз меньший, чем huffyuv и тем более rawvideo. В простом случае достаточно указать качество выводимого видео, определяемое аргументом -q:v.

    Разжал 24 мб в 135 мб.

 

Примечание:
Далее команды описываются для терминала Linux, но для командой строки Windows (cmd.exe) будет точно так же, только потребуется указать путь до ffmpeg.exe. Можно сделать удобнее, создав bat-файл.

 

Разожмём видео с использованием кодека mpeg4.

ffmpeg -i "/путь_до_видео/myvideo.mp4" -c:v mpeg4 -q:v 1 -an "/путь_вывода_видео/myvideo_out.avi"

Указать источник. Кавычки указываются для корректного чтения интерпретатором пробелов:
-i "/путь_до_видео/myvideo.mp4"

Указать кодек:
-c:v mpeg4

Указать уровень качества выводимого видео, где 1 — максимальное качество, а 31 — минимальное:
-q:v 1

Отбросить аудиопоток, что ускорит кодирование. Ведь звук не нужен для фрагмента видео?
-an

Если звук всё-таки нужен, то можно скопировать звуковой кодек и все прочие параметры по звуку из источника. Вместо -an прописать:
-c:a copy
Стоит отметить, что у avi бывают проблемы с синхронизацией видеопотока и аудиопотока.

Указать путь для выводимого файла:
"/путь_вывода_видео/myvideo_out.avi"

 

Подтверждаем выполнение кода и проверяем выведенный результат.

 

Разжатие видео с использованием rawvideo и huffyuv.

Если сильно захочется разжать по полной программе, используя rawvideo, то выводить лучше на другой физический диск, а не на тот же, где находится исходное видео, что существенно увеличит скорость перекодирования за счёт распределённой нагрузки на дисковую подсистему.

ffmpeg -i "/путь_до_видео/myvideo.mp4" -c:v rawvideo -an "/путь_вывода_видео/myvideo_out.avi"

При использовании huffyuv будет -c:v huffyuv, а в остальном команда идентична.

 

Бонус.

Ускорение или замедление видео с помощью ffmpeg и аргумента -r <число кадров в секунду>.

 

ffmpeg -r 30 -i "/путь_до_видео/myvideo.mp4" "/путь_вывода_видео/myvideo_out.avi"

Если аргумент -r указать до аргумента -i, то:

  • При уменьшении значения числа кадров видео будет замедляться.
  • При увеличении значения числа кадров видео будет ускоряться.

 

ffmpeg -i "/путь_до_видео/myvideo.mp4" -r 30 "/путь_вывода_видео/myvideo_out.avi"
Если аргумент -r указать после аргумента -i, то скорость видео не изменится, но:

  • При уменьшении значения кадры в видео будут пропускаться.
  • При увеличении значения числа будут добавлены промежуточные кадры.