Написано по следам вот этого поста. Все посты про 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. Ссылка на страницу скачивания здесь.
Чуть позже расскажу про мультиформатную конвертацию и выложу более лаконичный скрипт.