想要使用脚本将我的 m4a 文件转换为 mp3 文件。这会节省一些时间...我有超过 100 GB 的音乐文件。
操作系统:OSX10.14/终端与 Bash 脚本
我可以从终端运行ffmpeg -v 5 -y -i musicFile.m4a -acodec libmp3lame -ac 2 -b:a 320k musicFile.mp3
。它会转换文件,我可以从 iTunes 中查看和播放该文件。
当我从 bash 脚本运行相同的内容时,它无法转换。
ffmpeg -v 5 -y -i $ENTRY_FILE -acodec libmp3lame -ac 2 -b:a 320k $MP3NAME
我的 ipod nano 刚刚坏了,我买了一个新的 mp3 播放器。现在我需要将 iTunes 文件从 AAC 格式转换为 MP3。 ffmpeg是一个成熟的视频和音乐文件转换器。
当我从 bash 脚本运行它时,我尝试了一些操作。
我在文件前面添加了./,但失败了,因为它安装在/usr/local/bin下而不是在同一目录下。
我还尝试了 sh ffmpeg...这让我无法执行二进制文件。
#!/usr/bin/env bash
# convert m4a file to mp3
set -e
file_convert() {
ENTRY_FILE=$(printf %q "${entry}")
FILE_NAME=$(printf %q "$(basename "${entry}")")
DIR=$(printf %q "$(dirname "${entry}")")
NAME="${FILE_NAME%.*}"
EXT="${FILE_NAME##*.}"
MP3NAME="${DIR}/${NAME}.mp3"
printf "%*s%s\n" $((indent+2)) '' "$ENTRY_FILE"
printf "%*s\tNew File :\t%s\n" $((indent+2)) '' "$MP3NAME"
if [ $EXT == "m4a" ]
then
printf "%*s\tConverting: \t%s\n" $((index+2)) '' "$ENTRY_FILE"
ffmpeg -v 5 -y -i $ENTRY_FILE -acodec libmp3lame -ac 2 -b:a 320k $MP3NAME
fi
}
walk() {
local indent="${2:-0}"
printf "\n%*s%s\n\n" "$indent" '' "$1"
# If the entry is a file convert it
for entry in "$1"/*; do [[ -f "$entry" ]] && file_convert; done
# If the entry is a directory recurse
for entry in "$1"/*; do [[ -d "$entry" ]] && walk "$entry" $((indent+2)); done
}
# If the path is empty use the current, otherwise convert relative to absolute; Exec walk()
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || pushd "${1}" && ABS_PATH="${PWD}"
walk "${ABS_PATH}"
popd
echo
我希望 >./aacToMp3.sh ./music
遍历音乐目录并将每个 m4a 文件转换为 .mp3。
它正在遍历文件系统并打印出正确的文件,并转义空格。当它到达 ffmpeg 线时它就会停止。我将 set -e 放在文件顶部,以在命令失败时强制它失败。如果没有 set -e,它会愉快地遍历所有音乐文件并将它们打印到标准输出。
最佳答案
如果您有大量文件需要处理,并且有不错的多核 CPU 和快速磁盘,我会推荐 GNU Parallel,您可以使用 homebrew 安装它:
brew install parallel
然后在测试目录中复制一些文件并尝试:
parallel --dry-run ffmpeg -v 5 -y -i {} -acodec libmp3lame -ac 2 -b:a 320k {.}.mp3 ::: *.m4a
如果看起来不错,请将 --dry-run
替换为 --progress
。
如果看起来不错,您可以(先进行备份)并完成全部操作:
find path/to/music -name "*.m4a" -print0 | parallel -0 --progress ffmpeg -v 5 -y -i {} -acodec libmp3lame -ac 2 -b:a 320k {.}.mp3
关于bash -/usr/local/bin/ffmpeg : cannot execute binary file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348842/