Очередные приключения в мире FFMPEG и PowerShell.
Итак, тривиальная задача: перекодировать все видеофайлы в папке так, чтобы выходной файл был с видеопотоком h264 и аудиодорожкой aac. Теперь вооружаемся любимыми инструментами и атакуем мельницу…
Для начала создадим папку для выходных файлов и заставим командлет игнорировать ошибки:
New-Item -Path decode -ItemType Directory -ErrorAction Ignore
Осталось пробежаться циклом по всем файлам папки, предварительно отфильтровав нужный нам формат и скормить результат FFMPEG:
Get-ChildItem -Filter *.mp4 | ForEach-Object {
$cmd = "-i " + "$_" + " -preset medium -c:v libx264 -b:v 1500k -c:a aac -b:a 256k " + "decode\$($_.Name).mp4"
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow
}
Эта конструкция отправляет на конвертацию все файлы mp4, чтобы на выходе получить тот же самый контейнер, но скодированный одним кодеком и с одинаковыми параметрами. В примере указаны: видеокодек (-c:v libx264), битрейт видеопотока (-b:v 1500k), аудиокодек (-c:a aac) и его битрейт (-b:a 256k). Пресет для кодека h264 я указал medium — это среднее значение для настроек кодирования. Чтобы дать прирост скорости кодирования в ущерб качеству надо medium заменить на fast. Разумеется, чтобы получить на выходе достаточно качественный результат (при условии качественного исходника) можно поиграть с битрейтом видеопотока и поставить пресет на slow.
Если Вам нужно перекодировать AVI в MP4 — просто меняйте отбор в цикле:
Get-ChildItem -Filter *.avi | ForEach-Object {
$cmd = "-i " + "$_" + " -preset medium -c:v libx264 -b:v 1500k -c:a aac -b:a 256k " + "decode\$($_.Name).mp4"
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow
}
Также поступайте и со всеми остальными форматами. Главное указать расширение выходного контейнера.
Единственный минус такого подхода — имена файлов должны быть без пробелов.
UPD: здесь я собрал в скрипт конвертацию mp4.