从 YouTube 获取音乐:按你的方式
几个月前,我的岳父说他的公司正在更新他们的电脑。当我听说一些二手 PC 即将可用时,我决定拿一些,心想在扩大我的家庭网络和使用 GNU/Linux 做实验方面,几台旧 PC 也无妨。当我的岳父问是否可以重新格式化其中一台电脑,以便他可以在家中使用时,我抓住机会将另一位用户带入 GNU/Linux 的世界。几天过去了,他成为了运行 Ubuntu 的新电脑的快乐用户,并且在浏览网页时,他很享受他的 Firefox。我不知道其他人怎么想,或者可用性研究怎么说,但他说他使用该系统没有任何问题,并且他对我不必安装防病毒软件感到惊讶。
几周后,他说他发现了精彩的 YouTube 系统,并且作为一个狂热的爵士乐听众,他喜欢探索 1950 年代和 60 年代的许多古典作品。他想知道是否有可能从这些 YouTube 视频中抓取音乐并将其放在 CD 上,以便他可以在开车时收听。起初我认为可能存在一些 Firefox 附加组件可以做到这一点,但我懒得搜索。相反,我决定看看我是否可以利用我最喜欢的开发环境 Bash 来解决这个问题,并想出一些可以处理这项任务的东西。
第一步是考虑我需要哪些组件,以便可以使用 Bash(完美的粘合剂)将它们集成在一起
- 一个可以从 YouTube(或其他视频服务)下载视频文件的实用程序
- 一个从视频文件中提取声音的实用程序
- 以及一个可以将声音文件转换为我想要的格式(例如 MP3)的实用程序
记住 UNIX 和 GNU/Linux 实用程序的关键方面之一是“做好一件事,并且做得非常好”,我想出了以下实用程序,它们只做一件事,而且做得非常好
- youtube-dl:一个不错的 Python 脚本,可以从 YouTube 和其他网站下载视频
- ffmpeg:功能强大的实用程序,可以处理和转换任何类型的视频或声音文件
- lame:将声音数据编码为 MP3 的完美选择
第一个组件 youtube-dl 是一个非常易于使用的命令行实用程序,用于从 YouTube 下载视频文件。例如,为了从 http://www.youtube.com/watch?v=6E2hYDIFDIU 下载 Frank Sinatra 的 “My Way”,您只需发出命令
$ youtube-dl http://www.youtube.com/watch?v=6E2hYDIFDIU
即可将视频文件存储在某个位置。在这种特定情况下,您应该能够在运行 youtube-dl 命令的目录中看到 6E2hYDIFDIU.flv。您还可以借助 youtube-dl 自动获取视频的标题
$ youtube-dl --get-title http://www.youtube.com/watch?v=6E2hYDIFDIU
Frank Sinatra,My Way,带歌词
一旦你有了视频文件,第二步是从中提取音频数据,这可以通过一个简单的 ffmpeg 命令轻松实现
$ ffmpeg -i 6E2hYDIFDIU.flv 6E2hYDIFDIU.wav
这将立即从已下载的文件中提取音频信息到 WAV 编码文件中。一旦您在该文件中有了音频数据,就可以将其转换为 MP3 文件,这可以使用 lame 编码器实用程序完成。与之前的实用程序一样,lame 的基本用法非常简单
$ lame 6E2hYDIFDIU.wav 6E2hYDIFDIU.mp3
瞧!您的 MP3 文件已准备好供您欣赏。您可以删除大的 .wav 文件并将您的 .mp3 文件刻录到 CD 上,以便在您的汽车音响上收听。
一旦我们准备好并测试了所有组件,我们就可以创建一个非常简单的 Bash 脚本,该脚本可以将 YouTube 网址作为输入,并生成 MP3 文件作为输出
1 #!/bin/bash 2 # A very simple Bash script to download a YouTube video 3 # and extract the music file from it. 4 address=$1 5 regex='v=(.*)' 6 if [[ $address =~ $regex ]]; then 7 video_id=${BASH_REMATCH[1]} 8 video_id=$(echo $video_id | cut -d'&' -f1) 9 video_title="$(youtube-dl --get-title $address)" 10 youtube-dl $address 11 ext="flv" 12 ffmpeg -i $video_id.$ext "$video_title".wav 13 lame "$video_title".wav "$video_title".mp3 14 rm $video_id.$ext "$video_title".wav 15 else 16 echo "Sorry but the system encountered a problem." 17 fi
如果您将此脚本另存为 youtube2mp3.sh 并通过发出以下命令将其转换为可执行文件
chmod +x youtube2mp3.sh
您可以使用以下命令运行它来下载 “My Way”
./youtube2mp3.sh http://www.youtube.com/watch?v=6E2hYDIFDIU
脚本的第四行是我们从命令行获取 YouTube 视频地址作为第一个参数的位置。第 5、6、7 和 8 行依赖于 Bash 中正则表达式和 cut 实用程序的使用。我们想要的是以 ‘v=’ 开头的部分,我们不需要它后面的参数,例如 ‘&feature=related’。一旦处理完毕,我们就会获得 YouTube 用于识别视频的唯一代码,并将其存储在 video_id 变量中。第 9 行是我们借助 youtube-dl 检索视频文件的标题并将其存储在 video_title 变量中的位置。为了简单起见,我假设视频文件的扩展名将是 ‘.flv’,并将其存储在变量 ext 中。第 12 和 13 行完成了提取声音数据并将其存储在 MP3 文件中的任务,最后在第 14 行,我们通过删除视频文件以及不再需要的 .wav 文件来完成内务处理。如果脚本遇到提供的 YouTube 地址格式的任何问题,第 16 行会报告一个非常简单的错误消息。
上面这个简单的 Bash 脚本远非完美。它的目的是尽可能简单,而没有考虑许多重要的事情,例如实际的错误处理、不同的 YouTube 视频格式以及一个简单的帮助系统,以便在参数输入不正确或丢失的情况下报告用法。一个稍微复杂的 Bash 脚本,它还借助出色的 xenity 实用程序使用了简单的图形用户界面,可在 https://github.com/emres/youtube2mp3 上找到(随意破解代码并向作者发送拉取请求 ;-) 像往常一样,我很高兴探索这些实用程序并将它们组合起来,创建一个对其他人也有用的解决方案。当然,如果没有 GNU/Linux 的灵活性和我们所处的自由软件世界,这几乎是不可能的。我希望您在开车时也能像我和我的岳父一样享受您的音乐。
祝您编程愉快。