У меня есть сценарий PowerShell, который вызывает ffmpeg для двухпроходного кодирования всех видеофайлов .mp4 в текущей папке.
foreach ($i in Get-ChildItem . | Where { $_.extension -like ".mp4" }) {
ffmpeg -y -i "$i" -c:v libx265 -b:v 2.2M -preset medium -x265-params pass=1 -an -f mkv NUL
ffmpeg -i "$i" -c:v libx265 -b:v 2.2M -x265-params pass=2 -c:a libopus -ac 1 -b:a 64k -preset medium "small\$i.mkv"
}
Он отлично работает, но останавливает мою систему, когда в использовать, поэтому я хочу дать процессам ffmpeg низкий приоритет и сходство, которое позволяет им использовать только два ядра процессора. Поэтому я пытаюсь
foreach ($i in Get-ChildItem . | Where { $_.extension -like ".mp4" }) {
start "x265ify" /wait /low /b /affinity C ffmpeg -y -i "$i" -c:v libx265 -b:v 2.1M -preset medium -x265-params pass=1 -an -f mkv NUL
start "x265ify" /wait /low /b /affinity C ffmpeg -i "$i" -c:v libx265 -b:v 2.1M -x265-params pass=2 -c:a libopus -ac 1 -b:a 64k -preset medium "small\$i.mkv"
}
Это не работает, потому что -i
считается неоднозначным. Поэтому я пытаюсь поместить всю команду ("ffmpeg -y -i..."
и далее) в строку, избегая кавычек. Это не работает, потому что не может быть найден позиционный параметр, который принимает /low
. Я пытаюсь пропустить это, передав команду как отдельную переменную, и все, что я пытаюсь сделать, похоже, не работает.
Тем не менее, у меня есть скрипт Ruby, вызывающий ffmpeg точно так же, как работает . На нем написано
start "x265-ifier" /wait /low /b /affinity #{AFFINITY} ffmpeg \
-hide_banner \
-i "#{v}" \
-vf scale=-2:#{HEIGHT} \
-c:a libopus \
-b:a #{AUDIO_BITRATE}k \
-ac 1 \
-c:v libx265 \
-x265-params vbv-maxrate=#{MAX_VIDEO_BITRATE}:vbv-bufsize=7000 \
-preset #{PRESET} \
-crf #{CRF} \
"#{dest}" \
-y
Так что я делаю не так? Почему PowerShell не хочет запускать эту команду, которая работает нормально, если Ruby является посредником? Почему /low
не является параметром, когда он указан в документации как единое целое, и как я могу сделать -i
менее двусмысленным, когда вся строка, переданная в start
, должна быть командой, которую он выполняет, с -i
как действительный аргумент этой команды?