使用`say`前缀mp3文件的标题

提姆

我有一堆.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一步。但是,使用ffmpegmp3wrap或其他事情似乎并没有任何工作,我的猜测是,它的东西与所产生的文件做say没有流适量(不管这可能意味着)。

有关如何解决此问题的建议,或如何以完全不同的方式做到这一点的建议?

亚历山大·雷沃(Alexander Revo)

修改了脚本以使用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生成的文件似乎都可以正常工作,并且可以正确播放整个文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章