我有一堆 .mp3 文件,我想修改它们,以便它们以语音说出文件名开始。最简单的方法(或者我认为)是这样的:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv $file $BASE-bak.mp3
say "[[volm 0.4]] $BASE" -o $BASE-pre.aiff
ffmpeg -i $BASE-pre.aiff -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 $BASE-pre.mp3
rm $BASE-pre.aiff
mp3cat -o $file $BASE-pre.mp3 $BASE-bak.mp3
done
这几乎可以,但是生成的 mp3 文件已损坏(长度正确,但没有声音,并且总是在说出文件名所花的时间(我假设)之后(大约 2 秒)停止播放)。一切似乎都在这一步中断了mp3cat
。但是,使用ffmpeg
或mp3wrap
或其他东西似乎也不起作用,我的猜测是,这与生成的文件没有say
正确数量的流有关(无论这意味着什么)。
关于如何修复此问题或如何以完全不同的方式修复此问题有什么建议吗?
答案1
修改了脚本以使用 ffmpeg。与往常一样,在运行脚本之前备份文件以避免丢失数据。
选项1
速度较慢,将重新编码文件,但保留元数据:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.mp3" -i "${BASE}-bak.mp3" -filter_complex [0:a][1:a]concat=n=2:v=0:a=1 -map_metadata 1 "${file}"
rm "${BASE}-pre.mp3"
done
选项 2:
速度快,无需重新编码,元数据将丢失:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
echo "file '${BASE}-pre.mp3'" >temp
echo "file '${BASE}-bak.mp3'" >>temp
ffmpeg -f concat -safe 0 -i temp "${file}"
rm "${BASE}-pre.mp3"
rm temp
done
无论哪种方式,生成的文件似乎都可以使用 QuickTime 正常运行,并且可以正确播放整个文件。
答案2
尝试一下:将目标 .mp3 也转换为您要转换的格式。重写您的步骤并进行一些修改,并注意以下几点:
mkdir -p backup/
mkdir -p working/
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
say "[[volm 0.4]] $BASE" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
ffmpeg -i "$file" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-bak.mp3"
rm "${BASE}-pre.aiff"
mv "$file" backup/
mp3cat -o "$file" "${BASE}-pre.mp3" "${BASE}-bak.mp3"
mv "${BASE}-pre.mp3" working/
mv "${BASE}-bak.mp3" working/
done