Я хочу конвертировать видео из одного формата в другой, используя ffmpeg, и иметь некоторую «гибкость», позволяя иметь набор предопределенных настроек конвертации. Однако это не работает, если я передаю параметры как массив или переменные из PowerShell.
Структура папки проекта:
- main folder
-- input <-folder
-- output <-folder
-- convert.ps1 <- script to launch batch conversion
Мой код:
# this is content of convert.ps1
$VideoFileTypes = '*.mkv', '*.mp4', '*.webm', '*.mov'
$VideoInputFolderNamee = 'input'
$VideoOutputFolderName = 'output'
$VideoInputFolder = Join-Path -Path $PSScriptRoot -ChildPath $VideoInputFolderName
$VideoOutputFolder = Join-Path -Path $PSScriptRoot -ChildPath $VideoOutputFolderName
# FFMPEG convertion parameters ----------------------------------------------
[array]$h265 = '-c:v libx265', '-crf 22', '-c:a opus', '-b:a 128k'
$h264 = '-c:v libx264 -preset veryslow -crf 22 -c:a aac'
[array]$h264_2 = "-c:v libx264", "-preset veryslow", "-crf 22", "-c:a aac"
# ---------------------------------------------------------------------------
Get-ChildItem -Path $VideoInputFolder -Recurse -File -Include $VideoFileTypes | Foreach-Object {
$OutputFileName = $_.BaseName + ".mkv"
$OutputFilePath = Join-Path -Path $VideoOutputFolder -ChildPath $OutputFileName
Write-Output $_.FullName
Write-Output $OutputFilePath
# reference to one of existing configurations (specified above)
$parameters = $h265
# actuall call for conversion
& ffmpeg -i $_.FullName $parameters -y $OutputFilePath
}
Если набор параметров определен как массив с одинарными кавычками, например $h265
, я получаю сообщение об ошибке:
Invalid stream specifier: v libx265.
Если набор параметров определен как массив с двойными кавычками, как $h264_2
, тогда я получаю ошибку:
Unrecognized option 'crf 22'.
Error splitting the argument list: Option not found
Если набор параметров определен как строка, как $h264
, то ошибка:
Invalid stream specifier: v libx264 -preset veryslow -crf 22 -c:a aac.
Некоторое время я думал, что что-то не так с самой установкой ffmpeg, как упоминалось здесь . Но я так не думаю, так как прямое указание параметров работает вполне нормально:
& ffmpeg -i $_.FullName -c:v libx264 -preset veryslow -crf 22 -c:a aac -y $OutputFilePath
или
& ffmpeg -i $_.FullName -c:v libx265 -crf 28 -c:a opus -b:a 128k -y $OutputFilePath
Пожалуйста, помогите решить эту проблему.
[РЕШЕНИЕ]:
(1): использовать каждую часть массива:
...
$h265 = '-c:v', 'libx265', '-crf', '28', '-c:a', 'aac', '-b:a', '128k'
...
$parameters = $h265
& ffmpeg -i $_.FullName $parameters -y $OutputFilePath
...
(2) использовать строка и сплит
...
$h265 = '-c:v libx265 -crf 28 -c:a aac -b:a 128k'
...
$parameters = $h265
$parameters = $parameters.Split(" ")
& ffmpeg -i $_.FullName $parameters -y $OutputFilePath
...