背景
老婆喜欢听歌,而且很多是在Youtube上下载,像封面那种几十个歌曲放在一起的一个长视频,首先,这个视频是静止的,其实我只想要音频就好了,mp3格式或者acc格式完全可以了,其次,这些歌曲如果能下载下来就好了,最后,我希望能分割成短的歌曲,是多个mp3文件。
安排
准备
首先,需要安装两个工具:
-
FFMpeg,著名的开源视频框架,下载地址:https://ffmpeg.org/download.html, 找到自己操作系统对应的安装包,安装即可
-
yt-dlp, 开源的视频下载工具,安装知道:https://github.com/yt-dlp/yt-dlp/wiki/Installation#with-pip,注意,如果是通过pip安装的话,确保python版本高于3.8
下载音频文件
现在我们来准备下载youtube视频(然后会转换为音频mp3)
yt-dlp [youtube-video-url] -x --audio-format mp3
其中,-x
表示输出音频,--audio-format mp3
表示格式为mp3
下载完成后,我们就得到一个mp3文件,用播放器播放时,可以看到播放时长超过10小时
分析音频文件的静默点
由于这个长文件是用多个歌曲连起来的,通常在歌曲与歌曲之间有几秒钟的停顿或者静默,我们就可以用这个方法来找到歌曲分割点。
废话不多说,直接上代码
ffmpeg -i all-2.mp3 -af silencedetect=noise=-50dB:d=0.5 -f null - 2>&1 | grep -E 'silence_start|silence_end' | awk '
{
if ($0 ~ /silence_start/) {
start = $NF
} else if ($0 ~ /silence_end/) {
end = $5
print start " " end
}
}' | awk 'BEGIN {prev=0} {print prev,$1 - prev; prev = $1}' |awk 'BEGIN {findex = 0}
{
print "ffmpeg -i all-2.mp3 -ss "$1" -t "$2" -acodec copy "findex++".mp3\n"
}' | bash
注意上述代码中的all-2.mp3
要换成你自己的mp3文件(有两处要修改)
运行完之后,会看到多个mp3文件,诸如 0.mp3, 1.mp3, 2.mp3,等等