Pull to refresh

CMD-скрипт пакетного конвертирования видео в mkv/mp4 (x264, aac)

Приветствую, %habrauser%!
Хочу поведать о пакетном *.cmd файле, для преобразования большого количества видео в прогрессивный формат h264 со звуком aac, в контейнерах mkv/mp4, на компьютерах с ОС Windows.

предыстория

Был когда-то у меня замечательный фотоаппарат-мыльница Canon IXUS 75. Фотки делала замечательно, и даже умела снимать видео 640x480. Но беда была в том, что снимала она видео в формат avi с кодеком MJPEG (то есть по сути камера кучу снимков jpeg в секунду и соединяла в ролик), из-за этого всего каких-то 10 минут видео занимали порядком 200-400 Мбайт. Из-за чего архив видео-материалов очень быстро разрастался. И вот в какой-то момент, решил я это всё дело преобразовать в один из самых хорошо сжимаемых и прогрессивных форматов. Сначала я конвертировал файлы по одному, но это было очень неудобно, т. к. кодирует этот кодек довольно медлительно, и бегать каждые 20-40 минут чтобы сменить видео-файл было затруднительно.


варианты

Тогда я начал гуглить альтернативы, но увы, ничего тогда не нашёл толкового — либо программа плохо дружит с контейнером mkv, либо не дружит с кодеком x264, либо ещё какие-то косяки возникали.

решение

Так и пришла в голову идея написать пакетный файл, ведь тогда мы получаем огромное преимущество:
1) консольный енкодер — это основная ветка разработки, именно над ним ведутся разработки, и его компилируют в первую очередь, и практически каждый день, то есть — всегда свежая версия
2) консольный енкодер — это быстрая работа, без траты ресурсов на GUI
3) консольный енкодер — это обычно изолированное приложение, не требующее никаких дополнительных библиотек (.net framework и т. п.), а от ОС в принципе не требуются ничего кроме командной строки
4) большой список поддерживаемых файлов — библиотека libavcodec, реализованная в ffmpeg/x264 кушает большую часть всех видео/аудио форматов
5) поддержка AviSynth скриптов, что открывает огромные возможности для редактирования, кроме того некоторые базовые фильтры поддерживаются самими утилитами ffmpeg/x264 (обрезка, изменение размера, ...)

код

Написал я два варианта скрипта:
1) работает чисто с утилитой ffmpeg (для кодировки и сборки видео), и NeroAacEnc (для сжатия звука в aac)
Качать скрипт отсюда.
2) работает с набором утилит заточенных каждая на своё: x264 (для кодирования видео), ffmpeg (декодинг звука), neroAacEnc (кодинг в aac), mkvtoolnix (сборка mkv), mp4box (сборка mp4)
Качать скрипт отсюда.

пример кода варианта ffmpeg:
@echo off
setlocal

:: кол-во потоков (установите равным кол-ву виртуальных ядер, для полной загрузки)
set threads=1

:: контейнер на выходе (mkv, mp4)
set cont=mkv

:: сколько проходов (1, 2, 3, ...)
set pass=1

:: фактор качества видео (больше - хуже) (только однопроходный алгоритм)
set crf=20.0

:: битрейт (только многопроходный алгоритм) (bit/s)
set bitrate=500000

:: качество звуковой дорожки aac
set qaac=0.2

:: ограничить профиль H.264 (none, baseline, main, high, high10)
set profile=

:: предустановки кодирования (ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo)
set preset=medium

:: тонкая настройка фильтров в зависимости от содержимого (film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency)
set tune=

:: дополнительные команды (см. ffmpeg -help)
set add=

:: *** обработка комманд ***
if defined profile set profile=-profile %profile%
if defined tune set tune=-tune %tune%

:: *** старт команд ***
for %%i in (in/*.*) do (
echo ###############################################################################
echo [%DATE% %TIME%] *** convert file %%i ***
echo ###############################################################################

:: кодируем аудио
echo. & echo. & echo.
echo [%DATE% %TIME%] *** convert audio ***
ffmpeg -i in/%%i temp/%%~ni.wav
neroAacEnc -q %qaac% -if temp/%%~ni.wav -of temp/%%~ni.mp4
del temp\%%~ni.wav

:: кодируем видео
echo. & echo. & echo.
echo [%DATE% %TIME%] *** convert video ***
if %pass%==1 (
ffmpeg -y -threads %threads% -i in/%%i -i temp/%%~ni.mp4 -vcodec libx264 -crf %crf% -preset %preset% %profile% %tune% %add% -acodec copy -map 0:0 -map 1:0 -map_chapters 0:0 out/%%~ni.%cont%
) else (
echo. & echo. & echo.
echo [%DATE% %TIME%] *** 1 pass ***
ffmpeg -y -threads %threads% -pass 1 -i in/%%i -vcodec libx264 -b %bitrate% -preset %preset% %profile% %tune% %add% -an -map 0:0 out/%%~ni.%cont%
for /L %%j IN (3, 1, %pass%) do (
echo. & echo. & echo.
echo [%DATE% %TIME%] *** %%j pass ***
ffmpeg -y -threads %threads% -pass 3 -i in/%%i -vcodec libx264 -b %bitrate% -preset %preset% %profile% %tune% %add% -an -map 0:0 out/%%~ni.%cont%
)
echo. & echo. & echo.
echo [%DATE% %TIME%] *** %pass% pass [last] ***
ffmpeg -y -threads %threads% -pass 2 -i in/%%i -i temp/%%~ni.mp4 -vcodec libx264 -b %bitrate% -preset %preset% %profile% %tune% %add% -acodec copy -map 0:0 -map 1:0 -map_chapters 0:0 out/%%~ni.%cont%
)

del temp\%%~ni.mp4

echo.
echo [%DATE% %TIME%] *** complete convert %%i ***
echo. & echo. & echo. & echo. & echo.
)


Использование

Подготовка:
1) Скачать нужный вариант скрипта, распаковать в любую папку
2) Скачать все утилиты к нему, перенести все исполняемые файлы в распакованную папку

Перекодировка:
1) в папку /in закидывать файлы для перекодировки (все поддерживаемые ffmpeg, в том числе avs-скрипты)
2) отредактировать основные параметры в файле start.cmd
3) выполнить «start.cmd» или «start below.cmd» (второй запускает с пониженным приоритетом процессора)
4) ждём
5) в папке /out получаем перекодированные файлы

Также, все инструкции по использованию есть внутри.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.