循环复杂的 ffmpeg 命令时 Bash 参数 HELL。我该如何逃脱它?

标签 bash shell ffmpeg

我正在尝试使用 ffmpeg -filter_complex 为一堆视频创建波形 png
单行命令可以正常工作并为单个视频文件生成预期的波形图形:

ffmpeg -i INPUT.mp4 -filter_complex:a "showwavespic=s=1080x120" -frames:v 1 OUTPUT.png
当我尝试自动化多个文件的过程时
for f in *.mp4
do
 ffmpeg 
  -i "$f"
  -filter_complex:a "showwavespic=s=1080x120" 
  -frames:v 1 
  '"${f%.mp4}.png"'
done
ffmpeg 返回错误:

Unable to find a suitable output format for '"INPUT.png"'

'"INPUT.png"': invalid argument


我还尝试了精简命令:
for f in *.mp4
do
 ffmpeg -i "$f" -filter_complex 'showwavespic' -frames:v 1 “${f%.mp4}.png”
done
但得到了相同的参数错误。
我猜这个问题是因为 bash 语法,我没有正确地转义引用的参数。我尝试了多个版本的命令,但没有成功。如何解决这个 for 循环?

最佳答案

删除 ' 周围的单引号 ( "${f%.mp4}.png" ) .

您的第二个命令似乎使用了打印工的引号 ( ) 而不是普通的双引号 ( " ),这正是您想要的。

双引号 ( " ) 告诉 Bash 引号内的内容应被视为调用命令的一个参数,即使其中有空格。引号不会传递给被调用的命令。 Bash 不认为打印者的引号是特殊的,因此它将它们传递给命令,并且您的脚本将不起作用,因为它们实际上不是文件名的一部分。

关于循环复杂的 ffmpeg 命令时 Bash 参数 HELL。我该如何逃脱它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269290/

相关文章:

arrays - 访问 'cat' 输出作为 'bash' 中的数组

arrays - 将 bash 数组转换为 json 数组并使用 jq 插入到文件中

bash - 无法在远程 ssh 命令中使用变量

video - 随机位置的FFmpeg文本

python - FFMPEG 仅在写入管道时引发异常

linux - 如何选择未注释的行?

bash - 如何通过Bash中的curl从谷歌驱动器下载大文件?

用于删除文件 2 行中的 1 行的 Shell 命令\n

linux - 如何在 Linux 粘贴命令的结果中插入自定义字符串

ffmpeg - ffserver - 无效的编解码器名称 libvpx