【问题标题】:Problems with ffmpeg input filenames when using bash script使用 bash 脚本时 ffmpeg 输入文件名的问题
【发布时间】:2021-01-12 00:27:29
【问题描述】:

我正在尝试使用ffmpeg 将一些 .m4a 音频文件转换为 .mp3,但遇到了让我难过的事情。我想在与 .m4a 相同的位置和相同的文件名创建 .mp3,因此我使用find/exec 和 bash 脚本的组合来执行此操作,如下所示:

find /Volumes/Untitled/ -name '[!.]*' -name '*.m4a' -exec ./m4atomp3.sh {} \;

m4atomp3.sh 的样子:

#!/usr/bin/env bash
[[ -f "$1" ]] || { echo "$1 not found" ; exit 1 ; }
P="$1"
echo "$P is the full filename"
filename=${P%.*}
echo "$filename is the stripped filename"
m4afilename=\"$filename.m4a\"
echo "$m4afilename is the input filename"
mp3filename=\"$filename.mp3\"
echo "$mp3filename is the output filename"
mycmd="/Users/nickstyles/Downloads/ffmpeg -i "$m4afilename" -codec:a libmp3lame -qscale:a 2  -nostdin "$mp3filename
echo $mycmd
$mycmd

每当我尝试这个时,它都会失败,因为ffmpeg 找不到文件,似乎是因为文件名中的空格,例如如果文件被称为/Volumes/Untitled/My M4As/My M4A.m4a,我会看到:

ffmpeg version N-99346-g003b5c800f-tessus  https://evermeet.cx/ffmpeg/  Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.17)

[configuration details]

"/Volumes/Untitled/My: No such file or directory

但是,如果我只是将echo $mycmd 返回的内容粘贴到命令行中,例如:

/Users/nickstyles/Downloads/ffmpeg -i "/Volumes/Untitled/My M4As/My M4A.m4a" -codec:a libmp3lame -qscale:a 2 -nostdin "/Volumes/Untitled/My M4As/My M4A.mp3"

然后它工作得很好。我确定我遗漏了一些非常明显的东西,希望有人能发现!

【问题讨论】:

标签: bash macos ffmpeg


【解决方案1】:

正如Benjamin W. 指出的那样,问题是由于WordSplitting,变量仍然被bash 拆分,而我添加到变量内容中的引号并没有帮助解决这个问题。关键是要确保将引号放在变量本身周围,例如:

m4afilename=$filename.m4a
echo "$m4afilename is the input filename"
mp3filename=$filename.mp3
echo "$mp3filename is the output filename"
/Users/nickstyles/Downloads/ffmpeg -i "$m4afilename" -codec:a libmp3lame -qscale:a 2  -nostdin "$mp3filename" 

现在可以了!

【讨论】:

    【解决方案2】:

    试试这个:mycmd="/Users/nickstyles/Downloads/ffmpeg -i $m4afilename -codec:a libmp3lame -qscale:a 2 -nostdin $mp3filename"

    在 bash 中,您可以将变量直接放在双引号中。

    【讨论】:

    • $mycmd运行命令时还是会分词;当以"$mycmd" 运行时,整个字符串被认为是命令的名称,不会被找到。见BashFAQ/050
    • 啊,是的。确实,似乎我对 bash 分词规则没有给予足够的重视,感谢您指出这一点。
    猜你喜欢
    • 2013-06-10
    • 2015-11-13
    • 1970-01-01
    • 2017-10-26
    • 2021-04-03
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多