![通过 PowerShell 使用 FFmpeg - 在参数中正确使用破折号和引号](https://linux22.com/image/1523698/%E9%80%9A%E8%BF%87%20PowerShell%20%E4%BD%BF%E7%94%A8%20FFmpeg%20-%20%E5%9C%A8%E5%8F%82%E6%95%B0%E4%B8%AD%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%E7%A0%B4%E6%8A%98%E5%8F%B7%E5%92%8C%E5%BC%95%E5%8F%B7.png)
长期以来,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>
再次感谢您的帮助!