проблема передачи параметров из PowerShell в FFMPEG для пакетного преобразования видео - PullRequest
0 голосов
/ 12 марта 2020

Я хочу конвертировать видео из одного формата в другой, используя 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
...

1 Ответ

1 голос
/ 12 марта 2020

Имя и значение опции следует отправлять в виде отдельных строк, поэтому '-crf', '22' вместо '-crf 22'

...