Youtube

Youtube 是世界上最大的影音網站,應該很多人天天都在上面看影片吧,要是看到喜歡的影片想要下載,該怎麼做呢?如果是我,我平常都用 youtube-dl 來下載,我認為這是最優雅,最簡便,最快速的方式了,而且是開源軟體,還支援多種影音平台,可以說是下載影片的瑞士刀。

2020/02/08:增加進階指令教學

安裝

先去官網下載符合自己平台的檔案,Windows 有已經編譯好的可執行檔,Linux 可以直接將執行檔放入 /usr/local/bin/,或著用 pip 套件管理員安裝。

Windows 使用者下載完 youtube-dl 後請在 youtube-dl.exe 所在資料夾開啟 CMD 進行操作,至於怎麼在所在資料夾開啟 CMD 請參考之前的教學;亦或是把放置 youtube-dl.exe 的目錄加入環境變數,這樣就可以直接在 CMD 中調用。

類 UNIX 作業系統皆可用下面指令安裝。

1
2
$ sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
$ sudo chmod a+rx /usr/local/bin/youtube-dl

Arch Linux 建議用 pacman 安裝。

1
$ sudo pacman -S youtube-dl

也能使用 pip 安裝。

1
$ sudo pip install --upgrade youtube_dl

下載影片

以下載一部 Youtube 影片為例,先在 Youtube 找到你想下載的影片,然後複製網址。

1
$ youtube-dl https://www.youtube.com/watch?v=ZzvYGRH9H1M

這樣雖然能直接下載影片,但是不能選擇自己想要的品質,加上參數 -F 會列出提供哪些畫質下載。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
youtube-dl -F https://www.youtube.com/watch?v=ZzvYGRH9H1M
[youtube] ZzvYGRH9H1M: Downloading webpage
[youtube] ZzvYGRH9H1M: Downloading video info webpage
[info] Available formats for ZzvYGRH9H1M:
format code  extension  resolution note
249          webm       audio only DASH audio   54k , 1fps, opus @ 50k, 2.80MiB
250          webm       audio only DASH audio   76k , 1fps, opus @ 70k, 3.59MiB
140          m4a        audio only DASH audio  129k , m4a_dash container, mp4a.40.2@128k, 7.20MiB
171          webm       audio only DASH audio  132k , 1fps, vorbis@128k, 6.25MiB
251          webm       audio only DASH audio  184k , 1fps, opus @160k, 8.45MiB
160          mp4        256x144    144p  109k , avc1.4d400c, 15fps, video only, 5.92MiB
134          mp4        640x360    360p  248k , avc1.4d401e, 30fps, video only, 11.42MiB
133          mp4        426x240    240p  249k , avc1.4d4015, 30fps, video only, 13.60MiB
135          mp4        854x480    480p  518k , avc1.4d401f, 30fps, video only, 20.28MiB
136          mp4        1280x720   720p  887k , avc1.4d401f, 30fps, video only, 33.83MiB
137          mp4        1920x1080  1080p 1639k , avc1.640028, 30fps, video only, 62.66MiB
17           3gp        176x144    small , mp4v.20.3, mp4a.40.2@ 24k, 4.59MiB
36           3gp        320x180    small , mp4v.20.3, mp4a.40.2, 12.73MiB
18           mp4        640x360    medium , avc1.42001E, mp4a.40.2@ 96k, 19.78MiB (best)

要注意有些格式是只有純影片或純聲音的,像是 1080p 的通常只有純影片,選好你要下載的格式,把 format code 填入參數 -f 裡。

1
$ youtube-dl -f 137 https://www.youtube.com/watch?v=ZzvYGRH9H1M

品質

youtube-dl 預設會下載最高品質的影片,也可以指定畫質。

1
2
3
4
5
6
# 下載 MP4 格式中最高畫質,或是其他格式中的最高畫質
$ youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
# 指定最佳畫質,但不要高於 480p
$ youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]'
# 下載檔案大小小於 50M 的最高畫質影片
$ youtube-dl -f 'best[filesize<50M]'

影音合併

YouTube 1080p 以上畫質的影片視訊和音源是分開的下載的,傳統作法是先分別下載影片和聲音檔,再用其他工具合併,而 youtube-dl 可以整合 ffmpeg/avconv,下載完自動合併影音,非常方便。

-f 參數中同時寫入影片和音源格式代號就會自動合併,預設輸出格式為 mkv,可以用 --merge-output-format 參數來指定輸出影片封裝格式,可選值有:mkv, mp4, ogg, webm, flv

注意:當合併輸出格式為 mp4 時,音訊如果是 webm 格式合併時會出現錯誤,要指定為 m4a 或其他格式才能自動合併成功。

如果你要下載最高畫質的影片,並輸出為 MP4 影片可以這樣寫:

1
$ youtube-dl -f 'bestvideo+bestaudio[ext=m4a]' --merge-output-format mp4 https://www.youtube.com/watch?v=y5wkebBCwAE

一般人到這步就可以結束了,但如果你是對品質有強烈追求的偏執狂,請繼續看下去。

方法一:分別下載影片和音源,再合併成 MP4 (推薦)

如果你用 -F 去看會發現 m4a 的音訊通常不是最高音質,可以先用 -f 'bestvideo+bestaudio',並指定合併成 MP4,先將最高品質的影片和音源下載下來,但因為 webm 音源無法合併成 MP4,會保留影片和音源結束工作。

1
$ youtube-dl -f 'bestvideo+bestaudio' --merge-output-format mp4 https://www.youtube.com/watch?v=y5wkebBCwAE

下載下來有兩個 webm 格式的檔案,一個只有純影片,另一個只有純聲音,再手動用 ffmpeg 去合併。

1
$ ffmpeg -i audio.webm -i video.webm -acodec copy -vcodec copy -strict -2 output.mp4

由於 opus 編碼的音源在 MP4 格式中是實驗特性,所以要加上 -strict -2 才能合併成功,但有些老舊的播放器可能會因為不支援 opus 編碼而無法正常播放。

opus in MP4 support is experimental, add ‘-strict -2’ if you want to use it.

方法二:先合併成 webm,再轉檔成 mp4

youtube-dl 如果在 -f 參數中寫 'bestvideo+bestaudio' 會在下載完成後自動合併成 webm 影片檔,這時再用 ffmpeg 轉換成 mp4 格式。

1
$ ffmpeg -i input.webm output.mp4

雖然方便一點,但轉換的時間要很久,所以比較推薦使用方法一。

字幕下載

有 CC 字幕的影片 youtube-dl 也能下載。

參數:

  • --list-subs:列出可下載的所有字幕
  • --write-sub:儲存字幕
  • --embed-sub:將字幕合併至影片中,需搭配 --write-sub 參數使用
  • --all-subs:下載所有字幕
  • --sub-format:下載的字幕格式,如果原影片沒有指定的字幕格式會去下載其他格式的字幕
  • --sub-lang:選擇要下載的字幕語言,用逗號分隔,例如:zh_TW,ja
  • --convert-subs:將下載的字幕轉換成其他格式,目前支援 srt|ass|vtt|lrc

例如我想下載下面這部多語言字幕的影片。

多字幕影片

先用 --list-subs 列出所有可下載字幕,注意上面是 YouTube 自動產生的字幕,下面是人工翻譯上傳的字幕。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ youtube-dl  --list-subs https://www.youtube.com/watch\?v\=y5wkebBCwAE
[youtube] y5wkebBCwAE: Downloading webpage
[youtube] y5wkebBCwAE: Downloading video info webpage
[youtube] y5wkebBCwAE: Looking for automatic captions
Available automatic captions for y5wkebBCwAE:
Language formats
af       vtt, ttml, srv3, srv2, srv1
sq       vtt, ttml, srv3, srv2, srv1
am       vtt, ttml, srv3, srv2, srv1
...
yi       vtt, ttml, srv3, srv2, srv1
yo       vtt, ttml, srv3, srv2, srv1
zu       vtt, ttml, srv3, srv2, srv1
Available subtitles for y5wkebBCwAE:
Language formats
ca       vtt, ttml, srv3, srv2, srv1
zh-CN    vtt, ttml, srv3, srv2, srv1
zh-TW    vtt, ttml, srv3, srv2, srv1
en       vtt, ttml, srv3, srv2, srv1
fr       vtt, ttml, srv3, srv2, srv1
id       vtt, ttml, srv3, srv2, srv1
ja       vtt, ttml, srv3, srv2, srv1
ko       vtt, ttml, srv3, srv2, srv1
pt       vtt, ttml, srv3, srv2, srv1
pt-BR    vtt, ttml, srv3, srv2, srv1
th       vtt, ttml, srv3, srv2, srv1

我想下載正體中文和日文的字幕,並合併到影片中可以這樣寫:

1
$ youtube-dl --sub-lang zh-TW,ja --write-sub  --embed-subs https://www.youtube.com/watch?v=y5wkebBCwAE

預設會合併成一個 mkv 影片,字幕軌有之前嵌入的中文、日文字幕。

字幕軌

如果你想將字幕存成 srt 格式,加上 --convert-subs srt 參數。

1
$ youtube-dl --sub-lang zh-TW,ja --write-sub --convert-subs srt https://www.youtube.com/watch?v=y5wkebBCwAE

下載音樂

-x 參數提取音源,--audio-format 指定輸出格式,可選值:best, aac, flac, mp3, m4a, opus, vorbiswav,預設值為 best,要配合參數 -x 才有用。

1
$ youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=WI-EMzrUSP4

YouTube 最高音質通常為 opus 格式,如果選擇 mp3 位元率可能會被有損壓縮,如果想保持原來的位元率輸出格式請選 opus

其他參數:

  • --embed-thumbnail:嵌入影片縮圖(僅限 mp3m4a/mp4)
  • --add-metadata:加入影片資訊

假如我想下載這張落日飛車的香草渡假村

Sunset Rollercoaster - VANILLA VILLA

使用 --embed-thumbnail--add-metadata 就會把資訊寫在 ID3 標籤裡。

1
$ youtube-dl -x --audio-format mp3 --embed-thumbnail --add-metadata https://www.youtube.com/watch?v=gex2JGKDXIo

音樂標籤

下面是用 mpv 播放器播放 Opus 音檔(最佳音質)顯示的資訊。

這是 MP3 格式的位元率,其實兩者相去不遠,不必太在意。

下載播放清單

下載整份清單

跟下載影片一樣,只是把網址換成播放清單。

指定下載範圍

  • --playlist-start:播放清單起始位置
  • --playlist-end:播放清單結束位置
  • --playlist-items:指定範圍,逗號分隔,例如:1,2,5,8, 1-3,7,10-13

假設我要下載這個播放清單的 1~3 首歌,並存成 MP3 音樂檔。

SpongeBob Production Music

指令可以這樣下:

1
$ youtube-dl -x --audio-format mp3 --embed-thumbnail --add-metadata --playlist-items 1-3 https://www.youtube.com/watch?v=qRNTg7bk5LU&list=RDqRNTg7bk5LU

下載的音樂

這種指令在下載專輯的時候很有用。

Proxy 設定

如果你身在無法使用 Youtube 的國家要使用 youtube-dl,可以用 --proxy 參數進行代理。

youtube-dl 內建的 --proxy 參數,支持 Socks5 和 HTTP 代理伺服器,通常現代代理軟體(SS、SSR 等)預設的本機連接埠都是 socks5://127.0.0.1:1080

更多參數可以去看 youtube-dl 官方的 README

1
$ youtube-dl --proxy socks5://127.0.0.1:1080 https://www.youtube.com/watch?v=ZzvYGRH9H1M

其他影音平台

youtube-dl 除了可以下載 Youtube 影片,也能下載其他的影音平台,詳細支援網站詳見官方文檔,裡面列出了非常多的網站,你認識的影音平台應該都有列在上面,這裡示範如何下載 bilibili 的影片。

操作流程跟前面 Youtube 一樣,先到 B 站找尋你想要下載的影片,把網址複製。

先看提供哪些格式下載。

1
2
3
4
5
6
7
8
$ youtube-dl -F https://www.bilibili.com/video/av30534279
[BiliBili] 30534279: Downloading webpage
[BiliBili] 30534279: Downloading video info page
[info] Available formats for 30534279:
format code  extension  resolution note
0            flv        unknown
1            flv        unknown
2            flv        unknown    164.17MiB (best)

B 站提供的格式相較於 Youtube 少很多,應該也只能選 2 了。

1
2
3
4
5
$ youtube-dl -f 2 https://www.bilibili.com/video/av30534279
[BiliBili] 30534279: Downloading webpage
[BiliBili] 30534279: Downloading video info page
[download] Destination: 【FGO动画】无限流星制-Unlimited Stella Works--30534279.flv
[download]  81.8% of 164.17MiB at 622.88KiB/s ETA 00:49

youtube-dl 真的是下載影片的神器,自從用了 youtube-dl 就再也不需要其他影片下載軟體了。

Reference