本篇講解使用yt-dlp下載網站內嵌影片的用途,並討論yt-dlp指令的用法。
yt-dlp是一款開源、免費、無廣告的影片下載工具,為youtube-dl的分支版,主要用來下載Youtube影片。
- 相關文章: yt-dlp Youtube影片下載方式
有趣的是,名義上用於下載Youtube影片的「yt-dlp」也可以用來下載Youtube以外網站的影片。
基本上只要是使用m3u8串流影片的網站,yt-dlp都有辦法用類似的指令,把網頁的內容抓下來,再搭配ffmpeg自動將.ts轉檔成方便播放的.mp4格式。
於是乎,想下載網站影片,yt-dlp就成了幾近萬能的下載工具。足以取代VideoDownloadHelper、File Centepede、XX影片下載器等狗一票的軟體了。
1. yt-dlp支援的網站#
根據 官方Supported sites列表,yt-dlp支援許多熱門影片網站,我挑幾個中文圈比較熱門的舉例:
- Youtube
- Twitter / X
- Tiktok 抖音
- Threads
- Twitch
- Weibo 微博
- Vimeo
- Google Drive
- Bilibili 哔哩哔哩
- iQiYi 爱奇艺
- WeTV 腾讯视频
- YouKu 优酷
- Zhihu 知乎
- Niconico ニコニコ
- Crunchyroll
- AcFun
- Bandcamp
- NetEase Cloud Music 网易云音乐
- QQ Music QQ音乐
- FC2
- Iwara
- Patreon
- PornHub
- XVideos
沒有在列表上的網站也可以用yt-dlp試試看,yt-dlp程式會嘗試找出網頁中所有的影片讓你下載。
註:巴哈姆特動畫瘋已確認不行,請改用 AnimeGamerPlus下載。
1. 安裝yt-dlp#
yt-dlp支援Linux、Windows、macOS、Android、iOS系統。建議搭配ffmpeg使用,方便轉檔。
參見 yt-dlp安裝
雖然各大網站設計不同,但部份概念是通用的,不論是播放清單、直播、專輯封面、metadata等資訊,yt-dlp都會嘗試把它抓下來。
2. yt-dlp指令基本格式#
yt-dlp是命令行程式,必須在終端機打指令操作。
yt-dlp指令格式如下:
yt-dlp [參數1...參數2...參數3] "影片網址1" "影片網址2" "影片網址3"
yt-dlp至少得填入一個影片網址,其餘參數可以隨意組合,以方便你控制具體下載的內容。
有多個參數和網址的例子:
yt-dlp --output "%(title)s.%(ext)s" -f "bestvideo[height=1080]+bestvideo[ext=mp4]+bestaudio" "https://twitter.com/elonmusk/status/1745338260660854973/video/1"
如果只給網址,不加任何參數,就是讓yt-dlp自己判斷。
只有網址的例子:
yt-dlp "https://twitter.com/elonmusk/status/1745338260660854973/video/1"
3. 下載網頁影片的思考方向#
遇到問題,敬請參考 官方文件
讓yt-dlp自行決定#
這是最簡單的作法。預設狀況下,餵給yt-dlp影片網址,不加任何參數,如果該網站有在yt-dlp的支援列表,程式就會自動尋找最佳品質的影片下載,並自動按照寫好的規則合併影音。
網站太多了,我用Twitter舉例吧,其他網站敬請自行舉一反三。
比如我餵這個 Twitter影片的網址:
yt-dlp "https://twitter.com/elonmusk/status/1745338260660854973/video/1"
因為yt-dlp有這個網站的規則,它就會自動選取「最高畫質+最高音質」的網址,下載後自動合併音訊和視訊成為影片。
列出可下載的影片格式#
如果不確定目標網站有哪些影片解析度能下載,可以用-F
參數列出網頁中的影片。(不加-F
,yt-dlp會直接進行下載影片的動作)
yt-dlp -F "https://twitter.com/elonmusk/status/1745338260660854973/video/1"
範例輸出如下,我們可以看到這個Twitter網頁中有4個影片的ID列出來了
要手動下載特定網址的檔案,請用-f
參數加上ID
yt-dlp -f "http-2176" "https://twitter.com/elonmusk/status/1745338260660854973/video/1"
像Twitter這類網站的視訊和音訊是分開的,需要分別下載視訊和音訊後,手動用ffmpeg指令合併。
也有的網站下載下來就是影片檔了,需要多方嘗試。
不過正如我上面說的,如果yt-dlp本身就有支援該網站,你其實不用手動指定格式,一切交給yt-dlp決定就好。
使用條件過濾影片#
yt-dlp提供了多樣的條件過濾器,可以在下載影片時,從檔案大小、解析度、位元率去篩選結果。
請使用-f
參數,並於後方加上過濾條件。
如果下載時不加任何過濾參數,yt-dlp默認使用-f bestvideo+bestaudio
的過濾條件,也就是下載最佳影片與最佳音訊的影片。
yt-dlp提供「best」、「bestvideo」、「bestaudio」三種條件,best
(縮寫為b)會篩出網址中的影片和音訊,bestvideo
(bv)只有視訊,bestaudio
(ba)只有音訊囉。
所以-f bestvideo+bestaudio
的參數也可以寫成-f bv+ba
。
來做些變化,使用bestvideo加上height=720
,等同告訴yt-dlp,下載影片的時候選取720p以上高度(即720p畫質)的影片:
yt-dlp -f "bestvideo[height=720]" "網址"
如果加上<=
符號,過濾條件就會變成「選取畫質最高720p的影片」。
yt-dlp -f "bestvideo[height<=720]" "網址"
也可以使用其他的比較運算子<, >, >=, = , !=
,以及正則表達式。
指定影片寬度:
yt-dlp -f "bestvideo[width=1920]" "網址"
指定音訊位元率,單位為Kbps:
yt-dlp -f "bestvideo[asr>256]" "網址"
指定影片大小,單位為MB:
yt-dlp -f "bestvideo[filesize>=100M]" "網址"
指定影片副檔名:
yt-dlp -f "bestvideo[ext=webm]" "網址"
或者,只選取最佳音訊,不要視訊:
yt-dlp -f "bestaudio" "網址"
如果你要使用複合條件搜尋,那麼就使用加號和多個中括號分開。
這邊的例子是,選取1080p,且音訊位元率在256Kbps以上的mp4影片。
yt-dlp -f "bestvideo[heigh=1080]+bestvideo[etx=mp4]+bestaudio[asr>256]" "網址"
你還可以使用斜線/
隔開兩個表達式,達成備援選項的效果,例如以下範例,讓yt-dlp嘗試抓1080p的mp4格式影片,沒有的話就隨便抓。
yt-dlp -f "bestvideo[height=1080]+bestvideo[ext=mp4]+bestaudio / bestvideo+bestaudio" "網址"
如果同時使用-F
和-f
(注意大小寫),就是有點像「搜尋模式」的樣子,只列出該網址可下載的影片格式,並依照你給的條件過濾,不下載影片。
yt-dlp -F -f "bestvideo[height=1080]+bestvideo[ext=mp4]+bestaudio" "網址"
控制影片輸出檔名#
yt-dlp提供多個欄位,可按照影片的標題、網址、播放清單名稱決定下載的檔名。
使用--output
控制影片輸出的檔名,此參數若為空白,yt-dlp會自行決定輸出格式,像Twitter的影片就會變成「推文標題」+「影片網址數字」。
建議使用這個,用"%(title)s.%(ext)s
使輸出的影片完全符合原影片的標題,並包含附檔名。
yt-dlp --output "%(title)s.%(ext)s" "網址"
如果怕影片出現奇怪字元導致系統無法辨識,可加上--restrict-filenames
限制只能輸出ASCII編碼的字元。
yt-dlp --output "%(title)s.%(ext)s" --restrict-filenames "網址"
加上--windows-filenames
則是防止輸出Windows不相容的檔名
yt-dlp --output "%(title)s.%(ext)s" --windows-filenames "網址"
加上-P
可以指定目前要下載到哪個資料夾,比如Downloads
yt-dlp --output "%(title)s.%(ext)s" -P "/home/user/Downloads" "網址"
如果網站需要登入的話#
使用--cookies-from-browser
參數,將瀏覽器cookie(表示你的帳號在某網站登入狀態)傳給yt-dlp。
例如讀取Google Chrome的cookie,並下載影片:
yt-dlp --cookies-from-browser chrome "網址"
手動在瀏覽器用 Cookie Export之類的擴充功能,將cookie匯出單一txt檔案,再餵給yt-dlp也可以:
yt-dlp --cookies cookies.txt "網址"
如果要下載直播的話#
目前已知Youtube直播可以用--live-from-start
指定,Twitch不行。
yt-dlp --output "%(title)s.%(ext)s" --live-from-start "直播網址"
4. 在下載的影片嵌入額外資訊#
metadata指的是影片描述、演出者、等資訊,有些網站也支援嵌入縮圖到影片檔。
yt-dlp主要是為Youtube影片設計的程式,Youtube能下載的資料不見得能套用到其他網站上。
此外,你不一定要嵌入資訊到影片檔裡面,這些資訊都可以在下載時獨立存檔。
加上--add-metadata
參數會把影片的說明欄和其他資訊嵌入到影片檔的synopsis
欄位,音樂則是寫入到音訊檔的演出者資訊。
yt-dlp --add-metadata "網址"
加上--write-description
則是把說明欄輸出成單獨一個文字檔案。如果你只想要文字檔,那就加上--skip-download
跳過下載影片。
yt-dlp --write-description --skip-download "網址"
--add-metadata
和--write-description
可以同時使用。
以此類推:
--embed-thumbnail
嘗試把影片縮圖嵌入到影片檔內(需注意容器是否支援縮圖),--write-thumbnail
下載縮圖檔。
--embed-subs
嵌入字幕檔到影片,--write-subs
下載字幕檔。
--embed-chapters
嵌入時間軸章節資訊。
--embed-info-json
在影片嵌入json格式的影片資訊,僅支援mkv/mka容器。
5. yt-dlp下載影片轉檔操作#
指定影片和音訊格式#
與其下載後轉檔,何不在下載之時就指定好呢?
下載影片加上--merge-output-format
,yt-dlp就會嘗試將下載的結果合併成該影片格式,目前支援mkv, mov, mp4, webm的容器格式。
yt-dlp --merge-output-format mp4 "網址"
如果你想要在yt-dlp自動合併視訊音訊後保留所有原始檔案,那就加上--keep-video
參數。
yt-dlp --merge-output-format mp4 --keep-video "網址"
要抽出影片音訊,使用--extract-audio
參數,並指定音訊格式。這邊的例子是抽出音訊,並自動轉檔成320K的MP3。
yt-dlp --extract-audio --audio-format mp3 --audio-quality 320K "網址"
假設影片帶有章節資訊,那麼用--split-chapters
讓yt-dlp自動分段影片:
yt-dlp --split-chapters "網址"
傳給ffmpeg做進一步處理#
當然了,yt-dlp也支援在下載完成之後,丟給其他程式轉檔。
yt-dlp搭配ffmpeg的用法:在Linux的bash,搭配管線功能,將yt-dlp的內容導向至ffmpeg。
具體作法為在yt-dlp指令末端加上-o -
參數,再加上一個|
,後面就可讓ffmpeg承接yt-dlp所輸出的內容做處理。
# yt-dlp下載影片,輸出,讓ffmpeg增加影片的PTS數值,加快播放速度,並轉檔成mkv檔案
yt-dlp "網址" -o - | ffmpeg -i - -filter:v "setpts=0.5*PTS" output.mkv
6. 將yt-dlp常用參數存成設定檔#
覺得yt-dlp每次下載都要加一堆參數好煩?我們可以使用設定檔(config)將常用參數存起來。
根據官方文件,Linux/macOS的設定檔位於~/.config/yt-dlp/config
,Windows則是C:\Users\使用者名稱\AppData\Roaming\yt-dlp\config
那麼我們就將常用的參數設定檔存著,也就是不論下載影片或音樂,固定會用到的參數。
- 建立一個
yt-dlp.conf
檔案,裡面填入要用的參數,每行分隔。這裡我只放了固定輸出檔名為影片標題+副檔名
,不要有額外資訊。並一律給下載的檔案嵌入縮圖。
--output "%(title)s.%(ext)s"
--embed-thumbnail
- 這樣日後開啟終端機,下載影片就只需要打
yt-dlp "影片網址"
,剩餘參數會自動帶入設定檔所寫的內容。