PowerShell脚本中用&调用含=参数的FFmpeg命令报错求助
解决PowerShell脚本中调用FFmpeg命令出错的问题
我之前也碰到过一模一样的情况——直接在PowerShell或CMD里敲FFmpeg命令跑得顺风顺水,放到.ps1脚本里用&调用就报参数不识别的错。这本质上是PowerShell的参数解析逻辑和FFmpeg的参数格式不兼容导致的,PowerShell会把一些FFmpeg的特殊参数当成自己的语法来处理,导致FFmpeg接收到的参数乱掉了。给你几个靠谱的解决方案:
方案1:用Start-Process传递参数数组(推荐)
把每个FFmpeg参数单独拆成数组元素,让PowerShell原封不动地把参数传给FFmpeg,完全避免解析冲突:
Start-Process -FilePath "ffmpeg.exe" -ArgumentList @( "-hide_banner", "-i", ".\input.mkv", "-passlogfile", "input", "-c:v", "libvpx-vp9", "-b:v", "0", "-crf", "31", "-tile-columns", "6", "-tile-rows", "2", "-threads", "8", "-pass", "2", "-speed", "1", "-frame-parallel", "1", "-row-mt", "1", "-c:a", "libopus", "-b:a", "256000", "-c:s", "copy", "-af", "aformat=channel_layouts=5.1", "-auto-alt-ref", "1", "-lag-in-frames", "25", "-y", "output.mkv" ) -NoNewWindow -Wait
-NoNewWindow:让FFmpeg在当前PowerShell窗口执行,不会弹出新窗口-Wait:等待FFmpeg编码完成后再继续执行脚本后续内容
方案2:借助CMD来执行命令
既然命令在CMD里能正常跑,那我们可以让PowerShell调用CMD来执行整个命令,把参数解析交给CMD处理:
& cmd /c "ffmpeg.exe -hide_banner -i .\input.mkv -passlogfile input -c:v libvpx-vp9 -b:v 0 -crf 31 -tile-columns 6 -tile-rows 2 -threads 8 -pass 2 -speed 1 -frame-parallel 1 -row-mt 1 -c:a libopus -b:a 256000 -c:s copy -af aformat=channel_layouts=5.1 -auto-alt-ref 1 -lag-in-frames 25 -y output.mkv"
这个方法更简洁,适合不想拆分参数的场景。
为什么直接执行没问题?
交互式的PowerShell会话中,参数解析逻辑会更宽松,能正确识别FFmpeg的参数格式;但在脚本里用&调用时,PowerShell的参数解析会更严格,像-c:v、-af aformat=channel_layouts=5.1这类带特殊符号的参数容易被误解析,导致FFmpeg收到错误的参数,从而抛出“Unrecognize...”的错误。
内容的提问来源于stack exchange,提问作者Tupsi
相关产品推荐
相关产品推荐

