通过 PowerShell 使用 FFmpeg - 在参数中正确使用破折号和引号

通过 PowerShell 使用 FFmpeg - 在参数中正确使用破折号和引号

长期以来,StackExchange 一直是我寻找答案的首选之地——不幸的是,我找不到任何(可行的)解决方案来解决我当前的问题,因此我提出了这个问题。

我想要做的是创建一个 PowerShell 脚本(我对 PS 还很陌生),以通过 FFmpeg 自动处理文件列表(即与脚本共享同一文件夹的所有 MP4 文件)。

TL;DR:我无法工作:使用-vf "iamafilterargument"包含变量的过滤命令()。

当我手写到 cmd 中时,我尝试运行的命令是:

ffmpeg -i <input_file> -an -c:v libx264 -crf 16 -preset veryslow -vf "drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text='<input_filename>':bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5" <output_filename>.mkv

通过 cmd,一切按预期工作。现在我的 PS 脚本:

$encoder = "C:\FFMPEG\ffmpeg.exe"
$dateien = Get-ChildItem .\*.mp4
$dateinamen = ForEach-Object {$dateien.BaseName}    
    for($i=0; $i -lt $dateien.Length; $i++){
        $filterbefehl = " -i " + $dateien[$i] + " -an -map_metadata -1 -vf=`"drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text=" + $dateinamen[$i] + ":bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5`" -c:v libx264 -intra -crf 16 -hide_banner " + $dateinamen[$i] + ".mkv"
        Start-Process -FilePath $encoder -ArgumentList $filterbefehl -NoNewWindow; pause
    }
    Write-Host "Done!"

但是,我从 FFmpeg 收到此错误消息:(我故意保留了文件名 - 整个文件名为“cam4_2017-03-01_2238.mp4”。)

无法识别选项 'vf=drawtext=fontsize=12:fontfile=/Windows/Fonts/arial.ttf:text=cam4_2017-03-01_2238:bordercolor=black:borderw=2:fontcolor=white:x=(w-tw)/2:y=5:alpha=0.5'。拆分参数列表时出错:未找到选项

我尝试了各种各样的方法:

  • 使用双引号 ("") 代替反引号 (`")
  • 使用&$encoder $filterbefehl
  • 将 $filterbefehl 的内容包含到-ArgumentList
  • 对 $filterbefehl 使用单引号代替双引号

上面的结果是我目前能完成的最接近工作脚本的结果。我其他的尝试大多失败了,因为我搞不清楚如何获得正确的引号(“”和`”都不起作用)。

使用的软件: - Win10 Pro(虽然我希望它能在 Win >=7 上运行) - Powershell 5.1(Build 14393) - Zeranoe 网站上的 FFmpeg-binariy - 最新版本(20170225-7e4f32f)(使用 3.2.2 没有区别)

提前谢谢你的帮助!

答案1

@Mulvya 的回答是正确的——当更正-vf="<params>"为时-vf "<params>",代码就可以正常工作。

附注:如果其他人尝试使用 drawtext 并收到Fontconfig error: Cannot load default config file来自 FFmpeg 的错误 - 请检查您的工作目录是否不在系统磁盘上(例如 D:\Path)。如果是,请将您的代码更改为以下内容:

$system_volume = "C:\"
$files_volume = "D:\Path"
cd $system_volume <ffmpeg drawtext-command as above, with FULL PATH for input and output files>
cd $files_volume <additional commands>

再次感谢您的帮助!

相关内容