PowerShell · 08.05.2022

Скрипт для конвертации видео

Написано по следам вот этого поста. Все посты про ffmpeg можно найти здесь.

С помощью данного скрипта можно привести ряд видеофайлов в контейнере mp4 к одним параметрам. Используется цикл для фильтрации содержимого папки на наличие целевых файлов. В итоге предполагается, что выходные файлы будут скодированы кодеком h264 и aac. Важно учесть, что имена файлов не должны содержать пробелов.

Скрипт умеет переводить FullHD 1080р (а в принципе допускается конвертация и бОльших разрешений) в 720р или 400р с соблюдением соотношения сторон. Каждая задача складывает видеофайлы в соответствующую папку.

Можете сами поменять битрейт на нужный. Я отталкивался от slow пресета для кодека h264 и битрейта в 1500 килобит в секунду. Звук кодируется aac кодеком с битрейтом в 256 кб/c.

#### Шапка скрипта ####
$scriptname = "Скрипт для конвертации mp4"
[System.Console]::Title = $scriptname

#### Надпись при старте скрипта ####
Write-Host $scriptname -ForegroundColor Cyan

#### Меню ####
while($true) { 

         ## Формирование меню скрипта ##
         Write-Host
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "   1. mp4 в mp4" -ForegroundColor Green
         Write-Host "   2. mp4 1080p в mp4 720p" -ForegroundColor Green
         Write-Host "   3. mp4 в mp4 400p" -ForegroundColor Green
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "   4. Завершить работу скрипта" -ForegroundColor Red
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host

#### Селектор ####
$choice = Read-Host "Выберите вариант"
Write-Host
switch($choice){

1{
#### Конвертация MP4 в MP4 ####
New-Item -Path mp4 -ItemType Directory -ErrorAction Ignore | Out-Null
Get-ChildItem -Filter *.mp4 | ForEach-Object {
  $cmd = "-i $_ -preset slow -c:v libx264 -b:v 1500k -c:a aac -b:a 256k mp4\$($_.Name)"
  Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow }
 }

2{
#### Конвертация 1080p в 720p ####
New-Item -Path 720p -ItemType Directory -ErrorAction Ignore | Out-Null
Get-ChildItem -Filter *.mp4 | ForEach-Object {
  $cmd = "-i $_ -s hd720 -preset slow -c:v libx264 -b:v 1500k -crf 23 -c:a aac -b:a 256k -strict -2 720p\$($_.Name)"
  Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow }
 }

3{
#### Конвертация в 400p ####
New-Item -Path 400p -ItemType Directory -ErrorAction Ignore | Out-Null
Get-ChildItem -Filter *.mp4 | ForEach-Object {
  $cmd = "-i $_ -vf scale=""-2:400"" -preset slow -c:v libx264 -b:v 1500k -c:a aac -b:a 256k 400p\$($_.Name)"
  Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow }
 }

#### Завершить работу скрипта ####
4{ Exit }

#### Неверный выбор ####
default {Write-Host "Неверный выбор. Попробуйте снова." -ForegroundColor Red
         Write-Host}

  }
}

Ну, и само собой — скачайте и закиньте в папку со скриптом утилиту ffmpeg.exe. Ссылка на страницу скачивания здесь.

Чуть позже расскажу про мультиформатную конвертацию и выложу более лаконичный скрипт.