
每次別人問我如何下載 Youtube 影片,或是如何將 YouTube 影片下為 MP3,我唯一推薦使用的就是 youtube-dl,原因無他,它實在太強大了,不只可以下載 Youtube 的影片,很多知名網站的影音都可以下載。不過,它的小缺點是,原生的 youtube-dl 必須在命令列中自己打指令,如果想把影片轉為 mp3,還必須安裝 ffmpeg;哈!一般人光看到「打指令」、「安裝」就倒退 N 步了;所以有一些披著圖形界面,然後在背後使用 youtube-dl 的工具就應運而生。不過,如果要將 youtube-dl 的強大發揮到極至,打命令還是最有效率的。
一、兩個月前,突然發現原生的 youtube-dl 無法下載 YouTube 的影片了,到 github 中陸續看到有人在回報問題,因為原專案 (ytdl-org 的 youtube-dl) 最近一次更新一直維持在 2021.12.17,只好改用比較活躍的另一個分支 yt-dlp。
填寫表單自動安裝並下載影音
哈!當然,yt-dlp 當然還是以下指令的方式來使用。好啦!我在 Google Colab 中建了一個筆記本(畫面參考底下的 [圖1]),將 yt-dlp 稍微包裝了一下,就可以利用表單來填寫要下載的影片網址、勾選要下載 mp4 影片,還是 mp3 音檔,不用自己面對指令了。
[圖1] 中的「url」的輸入欄位,是用來輸入想下載的影音網址,以 YouTube 來說,可以輸入單一影片的網址,或是播放清單的網址;選取完想要下載的是 mp4 (影片),或是 mp3 (純聲音),再按一下「播放」的圖示,就會自動安裝並依設定執行程式,剩下的就是等待 Colab 幫我們將影音處理好,然後下載囉!這個 yt-dlp 的 Colab 筆記本可以在桌機、筆電、手機或是平板中執行,不過行動裝置因為有自動鎖定螢幕的機置,可能會中斷程式的執行,影片比較大的時候,要注意鎖定螢幕的問題。
![]() |
[圖1] Colab 上的 yt-dlp |
yt-dlp 影音下載工具的網址
下面這個是針對 yt-dlp 建立的 Google Colab 筆記本:
使用的方法很簡單,打開網址以後,進入 Colab 的頁面,先按一下上方的「複製到雲端硬碟」,即可在自己的雲端硬碟建立副本,並自動開啟;以後要下載影音時,就到自己雲端硬碟的「Colab Notebooks」資料夾中開啟自己建立好的副本即可;如果我的功能有更新,刪掉原有的副本,再開啟上面的網址,重新建立副本使用即可。
yt-dlp 合併為 mp4 的指令使用與除錯筆記
以下純屬個人的筆記,如果只是要用前述的工具,這部份建議略過不看,以免頭暈 ^_^ 。
在使用 yt-dlp 時,發現它和原生的 youtube-dl 顯著不同的地方。以預設值,直接下載 YouTube 的影片,它會將影片及聲音合併為 .mkv 格式的檔案;查了一下參數,照說使用「--merge-output-format mp4」可以將影音合併為 .mp4 的,但是一切並沒有如預期那麼容易,在我的電腦上,或是在 Google Colab 的環境中,都會出現類似這樣的錯誤訊息:
[youtube] wSBXfzgqHtE: Downloading android player API JSON
[info] wSBXfzgqHtE: Downloading 1 format(s): 248+251
[dashsegments] Total fragments: 6
[download] Destination: test3.f248.webm
[download] 100% of 55.29MiB in 00:00:25 at 2.14MiB/s
[dashsegments] Total fragments: 1
[download] Destination: test3.f251.webm
[download] 100% of 4.83MiB in 00:00:02 at 2.20MiB/s
[Merger] Merging formats into "test3.mp4"
ERROR: Postprocessing: Stream #1:0 -> #0:1 (copy)
從訊來看,影片有下載回來 (248.webm),聲音有下載回來(251.webm),問題出在最後合併為 .mp4 的階段。
如果我們在 yt-dlp 的指令中再加上「-v」,可以更清楚問題點。摘錄最關鍵的錯誤訊息:
Input #0, matroska,webm, from 'file:test3.f248.webm':
Metadata:
encoder : google/video-file
Duration: 00:04:48.66, start: 0.000000, bitrate: 1606 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 1920x1080, SAR
1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 1k tbc (default)
Input #1, matroska,webm, from 'file:test3.f251.webm':
Metadata:
encoder : google/video-file
Duration: 00:04:48.68, start: -0.007000, bitrate: 140 kb/s
Stream #1:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
[mp4 @ 0000000000146400] track 1: codec frame size is not set
[mp4 @ 0000000000146400] opus in MP4 support is experimental, add '-strict -2' i
f you want to use it.
Could not write header for output file #0 (incorrect codec parameters ?): Experi
mental feature
如果照上面紅色訊息中的指示,將「-strict -2」加在 ffmpeg 的參數中,的確就可以解決問題了。再去搜尋一下「opus in MP4 support is experimental, add '-strict -2' i f you want to use it.」,原來問題在 ffmpeg 的版本,我電腦中的 ffmpeg 和 Google Colab 環境中使用的 ffmpeg,都不是最新版,不加「「-strict -2」」,它就無法將「.webm」的聲音檔合併到 .mp4 中。如果將 ffmpeg 更新為最新的版本,ffmpeg 會自動幫忙處理好,yt-dlp 就不會因無法合併 .webm 產生錯誤而中斷了。
如果不更新 ffmpeg 也可以解決被 .webm 聲音檔打斷合併為 .mp4 影片的問題嗎?
既然知道是 .webm 聲音檔在作祟,那我們就限定聲音使用 mp4 可接受的聲音檔就好了,例如指定使用「m4a」格式,例如:
yt-dlp -f "bv+ba[ext=m4a]/b" --merge-output-format mp4 https://www.youtube.com/watch?v=dQomed4X80U
上面的關鍵在「-f "bv+ba[ext=m4a]/b"」裡的「ba[ext=m4a]」,它指定使用音質最好的聲音檔,而且指定要使用「m4a」格式的,這樣一來,影片和聲音合併為 .mp4 時就不會有問題了。
有沒有更簡單的?
當然有,像這樣:
yt-dlp -S "ext" --merge-output-format mp4 https://www.youtube.com/watch?v=dQomed4X80U
加上「-S "ext" 」的話,根據 yt-dlp 參數範例的說明,它就會用附檔名來決定選用的優先順序:
- 影片的優先順序: mp4 > mov > webm > flv
- 聲音的優先順序: m4a > aac > mp3 ...
「m4a」是會被優先選用的,完全符合我們合併為 .mp4 時的需求。
在 Colab 中將除錯的歷程記錄在下列筆記本中:
可以實際觀察到 Colab 目前的 ffmpeg (ver. 4.2.7) 和 yt-dlp (ver. 2023.03.04) 的錯誤訊息及可行的參數運用方法。
相關連結
- yt-dlp 專案:
https://github.com/yt-dlp/yt-dlp