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

8 Сен
2011

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

Был когда-то у меня замечательный фотоаппарат-мыльница Canon IXUS 75. Фотки делала замечательно, и даже умела снимать видео 640×480. Но беда была в том, что снимала она видео в формат 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 получаем перекодированные файлы
Также, все инструкции по использованию есть внутри.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх