想使用脚本将我的m4a文件转换为mp3文件。这样可以节省一些时间...我有超过100 GB的音乐文件。
OS:OSX10.14 / Terminal vs 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,它将愉快地浏览所有音乐文件并将其打印到标准输出。
答案 0 :(得分:2)
如果要处理的文件很多,并且有不错的多核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
答案 1 :(得分:1)
感谢所有输入。
一段时间后,我最终将所有ffmpeg行写入脚本文件。很高兴我做到了。我能够快速扫描文件并查看一些错误并进行修复。 这就是我想出的。 基本上,我是将纯文本写入标准输出并将其定向到文件。我将其转换为Shell脚本以转换每个文件。一次一个。过夜运行生成的脚本。
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"
if [ $EXT == "m4a" ]
then
printf 'echo "Converting %s ..."\n' "$FILE_NAME"
printf 'ffmpeg -v 5 -y -i %s -acodec libmp3lame -ac 2 -b:a 320k %s\n\n' "$ENTRY_FILE" "$MP3NAME"
fi
}
输出看起来像
#!/usr/bin/env bash
echo "Converting 03\ It\'s\ Not\ My\ Time.m4a ..."
ffmpeg -v 5 -y -i /Users/arthuranderson/Documents/work/projects/mp3Convert/music/3\ Doors\ Down/3\ Doors\ Down\ \(Bonus\ Track\ Version\)/03\ It\'s\ Not\ My\ Time.m4a -acodec libmp3lame -ac 2 -b:a 320k /Users/arthuranderson/Documents/work/projects/mp3Convert/music/3\ Doors\ Down/3\ Doors\ Down\ \(Bonus\ Track\ Version\)/03\ It\'s\ Not\ My\ Time.mp3
echo "Converting 01\ Down.m4a ..."
ffmpeg -v 5 -y -i /Users/arthuranderson/Documents/work/projects/mp3Convert/music/311/Greatest\ Hits\ \'93-\'03/01\ Down.m4a -acodec libmp3lame -ac 2 -b:a 320k /Users/arthuranderson/Documents/work/projects/mp3Convert/music/311/Greatest\ Hits\ \'93-\'03/01\ Down.mp3
标记我下次购买更多音乐时会尝试并行操作。
谢谢大家!