【发布时间】: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"
然后它工作得很好。我确定我遗漏了一些非常明显的东西,希望有人能发现!
【问题讨论】:
-
顺便说一句:将您的脚本粘贴到shellcheck.net 并尝试实施那里提出的建议。
-
试试这个,mycmd="/Users/nickstyles/Downloads/ffmpeg -i $m4afilename -codec:a libmp3lame -qscale:a 2 -nostdin $mp3filename"
-
在变量中存储命令(甚至只是 shell 语法,如引号)往往效果不佳;见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!一般来说,最好直接执行命令而不是先尝试存储。