FFmpeg. Разжатие видео в avi.
В предыдущей статье была рассмотрена конвертация (сжатие) видео в формат .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, то скорость видео не изменится, но:
- При уменьшении значения кадры в видео будут пропускаться.
- При увеличении значения числа будут добавлены промежуточные кадры.