2023年3月30日 星期四

Toots : yt-dlp 下載 Youtube 或是其它網站的影音

2023年3月30日 星期四

每次別人問我如何下載 Youtube 影片,或是如何將 YouTube 影片下為 MP3?我唯一推薦使用的就是 youtube-dl (目前活躍發展的版本稱為 yt-dlp ),原因無他,它實在太強大了,不只可以下載 Youtube 的影片,很多知名網站的影音都可以下載。

不過,它的小缺點是,youtube-dl 必須在命令列中自己打指令,如果想把影片轉為 mp3,還必須安裝 ffmpeg;哈!一般人光看到「打指令」、「安裝」就倒退 N 步了;所以有一些披著圖形界面,然後在背後使用 youtube-dl 的工具就應運而生。不過,如果要將 youtube-dl 的強大發揮到極至,打命令還是最有效率的。

一、兩個月前(2023年年初),突然發現原生的 youtube-dl 無法下載 YouTube 的影片了,到 github 中陸續看到有人在回報問題,因為原專案 (ytdl-org 的 youtube-dl) 最近一次更新一直維持在 2021.12.17,只好改用比較活躍的另一個分支「yt-dlp」。

我來安裝,您來填寫表單下載影音

哈!當然,yt-dlp 還是以下指令的方式來使用(太可怕了~~)。

好啦!不怕~不怕~我在 Google Colab 中建好了自動安裝 yt-dlp 及自動下載影音的程序,您只要在表單中填寫要下載的影片網址、勾選要下載 mp4 影片,還是 mp3 音檔,不用自己面對指令了。

[圖1] 中的「url」的輸入欄位,是用來輸入想下載的影音網址,以 YouTube 來說,可以輸入單一影片的網址,或是播放清單的網址;選取完想要下載的是 mp4 (影片),或是 mp3 (純聲音),再按一下「播放」的圖示,就會自動安裝並依設定執行程式,剩下的就是等待 Colab 幫我們將影音處理好,然後下載囉!

這個 Google Colab 中的 yt-dlp 執行時是在網頁瀏覽器中操作,所以可以在桌機、筆電、手機或是平板的網頁瀏覽器中執行。不過行動裝置因為有自動鎖定螢幕的機置,如果處理的時間較久,可能會因為自動鎖定螢幕而中斷程式的執行,影片比較大的時候,要注意鎖定螢幕的問題。

[圖1] Colab 上的 yt-dlp

yt-dlp 影音下載工具的網址

下面這個短網址是放在 Google Colab 中的 yt-dlp :

使用方法

使用的方法很簡單,

  1. 打開前述的網址以後,進入 Colab 的頁面。
  2. 在「影音檔的網址」的欄位中填入影音所在的網址,例如: YouTube 影片網址、Facebook 有公開分享的網址 ......。
  3. 選取要輸出的格式。
  4. 設定其它選項。
  5. 都設定好了,就按左側有個播放鈕(三角形的按鈕),啟動安裝及下載的程序。

影片如果檔案較大者,可能要花一點時間,才能將影音檔案由 Google Colab 下載到自己的電腦,稍安勿躁,喝杯茶,輕鬆一下吧~~


-----【分隔線】-----


-----【以下請忽略】-----



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) 的錯誤訊息及可行的參數運用方法。

相關連結


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket