You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:33:38