使用 YouTube 和提取音频

作者:Dave Taylor

在我最近的几篇文章中,我一直在探索 ImageMagick 的功能,表明仅仅因为您在命令行上工作并不意味着您只能处理文本。正如我解释的那样,ImageMagick 使处理图像变得容易添加水印,并且比标准的 Linux file 命令更准确地分析内容,以及更多更多。

在类似的思路下,我想在这篇文章中看看音频和视频。好吧,也许是“听”音频和“看”视频,但同样,我仍然专注于命令行,因此在这两种情况下,都需要播放器/查看器应用程序。

YouTube 转 MP3 音频

作为一个经常在线观看讲座的人,我也对在线服务很感兴趣,这些服务可以仅提取 YouTube 或 Vimeo 视频的音频部分并将其保存为 MP3。例如,开车时听讲座比试图在移动中不看视频要安全得多。

由于网上有如此多的现场音乐会表演,许多人也喜欢使用视频转 MP3 服务将这些歌曲添加到他们的音乐库中。

注意:要警惕任何内容下载和转换的版权问题。仅仅因为它在 Vimeo、YouTube 或其他在线服务上,并不意味着您有权提取音频甚至下载并将其保存在您的计算机上。

让我们从最基本的功能开始:从 YouTube 下载视频,以便您可以在 Linux 系统上观看。有很多浏览器插件甚至网站致力于这项任务,但是谁想冒恶意软件的风险或被色情网站广告困扰?真恶心。

幸运的是,GitHub 上有一个很棒的公共领域程序叫做 youtube-dl,它满足您的所有需求。在其最基本的功能中,它允许您从 YouTube 和各种其他在线视频存储库下载视频内容,但正如您将了解到的,它可以做更多的事情。

您可以在这里获取您系统的副本。

让我们首先下载我自己的一个 YouTube 视频的副本。这是一个关于出色的 1More 四驱动耳机的评测,其 URL 是 https://www.youtube.com/watch?v=BFL1E77hTHQ

顺便说一句:我有一个 YouTube 频道,我在那里评测消费电子产品和小工具。您应该订阅!在 http://youtube.com/askdavetaylor 找到我的所有视频。

YouTube 有很多方法可以组装 URL,包括使用其 URL 缩短器 youtu.be,但幸运的是,youtube-dl 可以处理这些变体。

现在,将视频副本下载到当前工作目录就像


youtube-dl 'https://www.youtube.com/watch?v=BFL1E77hTHQ'

命令的完整输出有点,嗯,复杂,但是


$  youtube-dl 'https://www.youtube.com/watch?v=BFL1E77hTHQ'
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
WARNING: Requested formats are incompatible for merge and
will be merged into mkv.
[download] Destination: 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f137.mp4
[download] 100% of 118.74MiB in 02:49
[download] Destination: 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f251.webm
[download] 100% of 4.81MiB in 00:03
[ffmpeg] Merging formats into "1More Quad Driver In-Ear
Headphones Reviewed-BFL1E77hTHQ.mkv"
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f137.mp4 (pass -k to keep)
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f251.webm (pass -k to keep)
$

您可以仔细阅读输出消息,但来自配套开源程序 ffmpeg 的消息是最重要的:merging formats into ... mkv

换句话说,视频的默认下载格式是 MKV。MKV 是越来越流行的 Matroska 多媒体容器格式的一部分,它适用于许多视频播放器(包括 VideoLan,又名 VLC,我最喜欢的跨平台视频播放器)。

快速的 ls 显示了结果,并且默认文件名取自视频的标题,这可能不是特别理想的


$ ls -lh *mkv
-rw-r--r--  1 taylor  staff   124M Jan 31 16:56 1More Quad
Driver In-Ear Headphones Reviewed-BFL1E77hTHQ.mkv

您是否更喜欢指定输出名称并将输出文件设为 MP4 (MPEG4) 格式?这是可以做到的


$ youtube-dl -o 1more-review.mp4 -f mp4 \
    'https://www.youtube.com/watch?v=BFL1E77hTHQ'
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
[download] Destination: 1more-review.mp4
[download] 100% of 57.63MiB in 00:27

作为奖励,您还可以从程序中获得不太不祥的信息性消息,因此它更简洁。而且输出,果然,是 MP4 格式


$ ls -lh *mp4
-rw-r--r--@ 1 taylor  staff  58M Jan 31 16:57 1more-review.mp4

作为第二个奖励,它的视频编码也更有效,因此下载视频的 MP4 版本只有 58M,而 MKV 合并版本为 124M。

那么如何观看呢?最有可能的是,双击它,它就会启动并运行,如图 1 所示。

图 1. 在 Ubuntu 播放器中播放的已下载 YouTube 视频

这很容易,但最初的目标是能够仅提取 YouTube 视频的音频组件,所以让我们看看这项任务。

仅下载音轨

既然我已经开始深入研究 youtube-dl 程序的命令行选项,那么不难发现还有另一个命令行选项可以让您仅保存视频的音频部分


$ youtube-dl -x --audio-format mp3 \
    'https://www.youtube.com/watch?v=BFL1E77hTHQ'
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
[download] Destination: 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.webm
[download] 100% of 4.81MiB in 00:07
[ffmpeg] Destination: 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.mp3
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.webm (pass -k to keep)
$ ls -lh *mp3
-rw-r--r--  1 taylor  staff   4.0M Jan 31 18:22 1More Quad
Driver In-Ear Headphones Reviewed-BFL1E77hTHQ.mp3

这很容易,而且输出非常小:总共 4MB。问题是,存在相同的笨拙命名问题,因此添加 -o 输出文件名 肯定会是一个胜利。但是,真的,只要您愿意弄清楚它的所有命令行选项,youtube-dl 就可以使这些任务变得非常容易。

编写包装器脚本

与其担心晦涩的命令行标志表示法,不如编写一个脚本来为您完成繁重的工作。我将把它称为 ytdl,代表“youtube 下载”,默认情况下,它将仅接受一个 URL 并输出一个 MP4 格式的视频文件,该文件具有与 YouTube 快捷方式相同的名称(例如,上面的视频将变为 BFL1E77hTHQ.mp4)。

添加第二个参数,它将成为输出文件名。指定 -a 标志,它将仅保存音频输出,格式为 MP3。

让我们从一个用法块开始,以防用户忘记指定任何内容或只是需要一个简单的提醒


if [ $# -eq 0 ] ; then
  echo "Usage: $(basename $0) {-a} YouTubeURL {outputfile}"
  echo "   where -a extracts the audio portion in MP3 format"
  exit 1
fi

这很简单。该脚本还将使用一些预定义的标志组合,以便于编写


youtubedl="/usr/local/bin/youtube-dl"
audioflags="-x --audio-format mp3"
videoflags="-f mp4"
flags=$videoflags       # default set of command flags
audioonly=0             # default is audio + video

如果用户指定了 -a 标志,audioonly 将设置为 true(即 1),并且默认标志将从视频切换到音频


if [ "$1" = "-a" ] ; then
  audioonly=1
  flags=$audioflags
  shift
fi

您会记得 shift 命令将所有参数“向下”移动一位到左边,所以 $2 变为 $1,依此类推。当然,这是一种在脚本中处理和丢弃参数的简单方法。

最大的代码块从 YouTube URL 创建默认输出文件名


if [ $# -eq 1 ] ; then
  # no output filename specified
  outfile=$(echo "$1" | cut -d= -f2)
  if [ $audioonly -eq 1 ] ; then
    outfile="$outfile.mp3"
  else
    outfile="$outfile.mp4"
  fi
else
  outfile="$2"
fi

这不是最健壮的代码,因为它假设指定的 URL 采用类似于此处使用的示例的格式,youtube-yadda-yadaa?value=shortcode。它提取短代码并简单地附加适当的文件名后缀。有更好的方法可以做到这一点,但这没关系,这现在可以使用。只需意识到,如果您有非常不同的 YouTube URL 类型或来自另一个站点的 URL,则您的输出格式可能会有点奇怪。

最后,是 youtube-dl 命令的实际调用


$youtubedl $flags -o "$outfile" "$1"

就是这样!现在您可以像这样简单地下载视频


$ ytdl 'https://www.youtube.com/watch?v=5yXDzg_QDGw' wiper.mp4

以及像这样的音频部分


$ ytdl -a 'https://www.youtube.com/watch?v=5yXDzg_QDGw'

不错,对吧?

我已经大大超出了本专栏的空间,但是这是一个如此有趣和简单的脚本,建立在一个很棒、功能强大的程序之上,这是值得的,对吧?现在您知道如何让 YouTube 为您工作,而不是反过来!

Dave Taylor 在 UNIX 和 Linux 系统上编写 shell 脚本已经很长时间了。他是 Learning Unix for Mac OS XWicked Cool Shell Scripts 的作者。您可以在 Twitter 上找到他,账号是 @DaveTaylor,您可以通过他的技术问答网站联系他:Ask Dave Taylor

加载 Disqus 评论