序言
本文記述下載 Youtube 、 Twitch 、 TwitCasting 、 Twitter Spaces 音訊空間,和影片轉檔的幾個常用工具和指令
延伸閱讀
關於監控、自動下載請見這篇
[Docker] 直播監控、自動影片下載筆記 ( Youtube 、 Twitch 、 TwitCasting 、 Twitter Spaces 音訊空間)
你可能也想看
讓軟體工程師告訴你,我如何讓我的V豚DD生活更加舒適
目錄
下載: yt-dlp
官方站:
https://github.com/yt-dlp/yt-dlp
下載點:
https://github.com/yt-dlp/yt-dlp/releases/latest
yt-dlp依賴於ffmpeg執行,請同時安裝ffmpeg
yt-dlp分家自youtube-dl,它涵蓋youtube-dl的所有功能,並且有著更多的功能,更多的patch,更活躍的開發社群。
除了Youtube外它也支援很多其它影片站,包括niconico、twitch、twitcasting、twitter、facebook,這裡是完整清單。 此處是完整的說明書、輸出檔名說明、格式指定說明。
列出所有影片格式
這條並不會執行下載,它會印出能下載的所有格式後結束 (如同此文首圖)
yt-dlp -F [url]
下載指定的影片格式
如果你要下載最高畫質的格式,不要傳入此參數,預設已是最高畫質!
此預設值為bestvideo*+bestaudio/best
有關於
bestvideo+bestaudio
和best
的解釋best
: 最好的格式
bestvideo+bestaudio
: 最好的影片格式,最好的音訊格式,並在下載完合併為一檔案
Youtube對於影像音訊合一檔案,最高只提供到720p畫質,再往上皆是分離格式。
也就是說以best
最多只能在Youtube下載到720p影片!
這也是為什麼各個瀏覧器擴充、下載網站不會給你高於720p的影片。
影片合併時會產生額外的主機開銷,而瀏覧器中無法進行合併作業。
以下範例為「下載影像137格式、音訊251格式後合併檔案」
yt-dlp -f 137+251 [url]
帶入cookie file下載,以下載需要登入才能瀏覧的影片
對於需要登入後才能瀏覧的影片,像是會員限定影片、Facebook私密社團影片等,yt-dlp支援傳入cookies file過驗證。
取得cookies file的方法
- 安裝瀏覧器擴充功能,以匯出Netscape HTTP Cookie File
- Chrome: Get cookies.txt LOCALLY
- Firefox: cookies.txt
- 瀏覧至Youtube網頁,登入你的帳號
- 以擴充功能匯出
youtube.com
網域的所有cookie- 將匯出之cookie檔案重命名為
cookies.txt
注意
此cookies file包含了你的Youtube登入授權
任何人只要取得這個檔案,即可由你的身份登入Youtube
請務必妥善保管,把它當成你的帳號密碼看待
yt-dlp --cookies "cookies.txt" [url]
帶入瀏覧器中的cookie下載,以下載需要登入才能瀏覧的影片
yt-dlp也能直接從你的瀏覧器扒出cookie,以使用相關網站的登入狀態。
支援的瀏覧器: brave, chrome, chromium, edge, firefox, opera, safari, vivaldi
yt-dlp --cookies-from-browser chrome [url]
在影片檔嵌入描述和影片縮圖
yt-dlp --embed-thumbnail --embed-metadata [url]
有時縮圖格式會是webp,而webp無法顯示在檔案總管
加上--convert-thumbnails jpg
把它一律轉檔為jpgyt-dlp --embed-thumbnail --convert-thumbnails jpg --embed-metadata [url]
輸出檔名範本
參數清單在此: https://github.com/yt-dlp/yt-dlp#output-template
yt-dlp -o "%(upload_date)s %(title)s (%(id)s).%(ext)s" [url]
使用aria2c下載器平行下載
下載點: https://github.com/aria2/aria2/releases/latest
串流處理過的影片會切成數個小段落傳輸,或是允許客戶端請求指定的檔案片段,這正好適合使用aria2c平行下載。
下方的範例使用16條連線平行下載,它幾乎可以吃到我300M的網速上限
yt-dlp --external-downloader aria2c --external-downloader-args "-j 16 --retry-wait 10 --max-tries 10" [url]
下載並封裝為mp4、mkv格式
必需注意編碼是否能封進對應的封裝格式,否則請不要給此參數,yt-dlp會自動選出合適的
yt-dlp --merge-output-format mp4 [url] yt-dlp --merge-output-format mkv [url]
不下載dash檔案
dash在Youtube是直播中提供的格式,是轉檔前的格式
你可以用這個參數以避開它,yt-dlp會在只有dash格式時報錯退出
yt-dlp --youtube-skip-dash-manifes [url]
下載開源格式
這裡的格式是指Google自己的vp8、vp9格式webm。它的壓縮率(通常)較mp4好,但要等youtube轉檔完才有。 建議搭配merge-output-format封裝為mkv,這絕對無法封裝進mp4。
yt-dlp --prefer-free-formats [url]
直播由起始下載
對,就是和ytarchive一樣的功能。
不知道yt-dlp哪裡沒處理好,約1/5的機率它不會合併影片,還會殘留碎片檔案。
別用這個,用下一小節介紹的ytarchive。
https://github.com/yt-dlp/yt-dlp/issues/2137
yt-dlp --live-from-start [url]
小結
把上面那串全部整理起來能得到下方幾個腳本
- 下載(通常壓縮率更好的)mkv
- 下載mp4
- 下載mkv,然後丟進mkclean處理,詳請見 #mkclean
- 下載mkv,然後執行cues_to_front處理,詳請見 #cues_to_front
下載: ytarchive
展開
官方站:
https://github.com/Kethsar/ytarchive
下載: 安裝golang後執行
go install github.com/Kethsar/[email protected]
Docker:
https://github.com/jim60105/docker-ytarchive
如果直播已開始,且你預測直播在結束後會直接砍檔,ytarchive就能派上用場了! yt-dlp在錄直播時是從現時點開始錄,你會失去已過去的直播部份,而ytarchive是由直播的開頭起始下載。
yt-dlp在2021/12/25實作了 --live-from-start ,基本上完全取代了ytarchive的功能。
但不知道yt-dlp哪裡沒處理好,約1/5的機率它不會合併影片,還會殘留碎片檔案。
這讓ytarchive留下了一條生路,ytarchive表現非常穩定
下載直播
注意格式是放在url後面,它和yt-dlp的傳參數方式不相同
ytarchive -w [url] best
帶入cookie下載,以下載需要登入才能瀏覧的影片
對於需要登入後才能瀏覧的影片,像是會員限定影片、Facebook私密社團影片等,ytarchive支援傳入cookies file過驗證。 取得cookies file的詳細步驟和上述相同,請見這裡
ytarchive -w -c cookies.txt [url] best
在影片檔嵌入描述和影片縮圖
ytarchive -w --add-metadata -t [url] best
輸出檔名範本
參數清單和youtube-dl相同
ytarchive -w -o "%(upload_date)s %(title)s (%(id)s)" [url] best
下載: Youtube Segment Downloader (Youtube片段下載器)
Github:
https://github.com/jim60105/YoutubeSegmentDownloader
下載點:
https://github.com/jim60105/YoutubeSegmentDownloader/releases/latest
Youtube片段下載器,指定秒數而不用下載整部影片
適合任何需要從Youtube下載影片段的人
這是我寫的
下載: Streamlink
官方站:
https://github.com/streamlink/streamlink
下載點:
https://github.com/streamlink/streamlink/releases/latest
Streamlink是串流下載的專用工具,它是為twitch開發
它也能用在Youtube直播,但Youtube上更推薦用yt-dlp
反過來也是,yt-dlp在抓twitch時常遇到檔案損壞,twitch請愛用Streamlink
我很少載twitch,用不到複雜的選項,完整的說明書在此
streamlink --twitch-disable-ads [url] "best"
下載: twitcasting-recorder
網站:
https://github.com/prinsss/twitcasting-recorder
這是twitcasting專用串流錄影工具
錄twitcasting這事我試了能我找到的所有工具,而這是唯一一個能運作的
安裝方式我不贅述,自行讀它的Readme
這是錄串流專用的,如果是下載既有影片請用yt-dlp
python main.py [url]
下載: twspace-dl
網站:
https://github.com/Ryu1845/twspace-dl
下載:
https://github.com/Ryu1845/twspace-dl/releases/latest
這是twitter space音訊空間專用下載工具
我參與了它的dockerize
下載完整存檔的方式
- 在結束後以space url下載,但space有可能被刪除
- 在直播時取得master url,並在結束後下載,master url會存活一個月
下載「正在開的」音訊空間
twspace_dl -U [twitter account url]
以space url下載音訊空間
twspace_dl -i [space url]
取得「正在開的」音訊空間的master url
twspace_dl -U [twitter account url] -u -s
以master url下載完整的音訊檔案
twspace_dl -U [twitter account url] -f [master url]
下載: Stream Recorder (Chrome 擴充功能)
官方站:
https://www.hlsloader.com/
下載點:
https://chrome.google.com/webstore/detail/stream-recorder-download/iogidnfllpdhagebkblkgbfijkbkjdmm
此工具適合用來下載yt-dlp未支援的其它小站點。
它是抓取網頁頁面中的影片流,當其它工具失效時,此工具值得一試。
轉檔: ffmpeg
官方站:
https://ffmpeg.org
下載點:
https://ffmpeg.org/download.html
轉檔就用ffmpeg,沒有第二選擇。
下方列幾個我常用的指令,完整指令表見說明書
mp4轉mkv
封裝格式是以附檔名指定
mkv可以封裝所有mp4能裝的格式,所以可以加上-c
copy使之複製內容,不重新編碼。
反過來mkv轉mp4時可能不行,要看編碼格式。如果裝不進去就去掉-c參數讓它自動轉檔。
ffmpeg -i in.mp4 -c copy out.mkv
加封面圖至mkv
這裡指的封面圖,是在檔案總管能讀出的縮圖
ffmpeg -i in.mkv -c copy -map 0 -dn -attach cover.png -metadata:s:t mimetype=image/png -metadata:s:t filename=cover.png out.mkv
加封面圖至mp4
這裡指的封面圖,是在檔案總管能讀出的縮圖
ffmpeg -i in.mp4 -i cover.png -map 1 -map 0 -c copy -disposition:0 attached_pic out.mp4
移除某一個軌道(移除指定的音軌、視訊、圖檔、字幕)
在移除前需要先確定要移除的軌道編號,這裡要使用和ffmpeg搭配的另一個工具: ffprobe
ffprobe video.mp4
此指令會印出所有軌道的內容,如下圖,第0軌是視訊、第1軌是音訊、第2軌是jpg附檔
接下來使用反向mapping: 將所有軌道導入後,減去不要的軌道
下方示範去掉jpg附檔,也就是第2軌,關鍵在於-0:2
ffmpeg -i in.mp4 -map 0 -map -0:2 -c copy out.mp4
更多有關negative mapping的範例請見
mp4 faststart
mp4檔案的moov atom (內包含了影片的索引)
預設是放在影片的最末尾。這不利於網路串流,無法查找索引,你必需從頭下載檔案才能播放。使用-movflags faststart
參數以把moov atom移至片頭以解決這個問題。
我個人會將上傳網路空間分享的mp4檔做這道轉檔,這能讓它的線上預覧正常串流。-movflags faststart
參數可以和其它mp4轉檔指令合併使用。
原文說明: 出處
Run a second pass moving the index (moov atom) to the beginning of the file. This operation can take a while, and will not work in various situations such as fragmented output, thus it is not enabled by default.
ffmpeg -i in.mp4 -c copy -map 0 -movflags +faststart out.mp4
mkv cues_to_front
請參考mkclean
mkv檔案的索引 (在mkv稱做cues)
預設是放在影片的最末尾。這不利於網路串流,無法查找索引,你必需從頭下載檔案才能播放。使用-cues_to_front yes
參數以把cues移至片頭以解決這個問題。
我個人會將上傳網路空間分享的mkv檔做這道轉檔。
注意,這在ffmpeg算是個新功能,從ffmpeg 5.1版開始支援。現時點不少網路空間並不支援mkv
cues_to_front串流,它們照樣從頭開始下載。
原文說明: 出處
If set, the muxer will write the index at the beginning of the file by shifting the main data if necessary. This can be combined with reserve_index_space in which case the data is only shifted if the initially reserved space turns out to be insufficient.
This option is ignored if the output is unseekable.
ffmpeg -i in.mkv -c copy -cues_to_front yes out.mkv
依時間剪切影片,不重新編碼
詳細說明請見
注意
未重新編碼時,會因為關鍵幀位置導致起始畫面凍結,以及影片長度不準確
移除-c copy
參數以進行重編碼
注意參數順序造成的差異
以下範例為剪出「由第1分鐘起,長2分鐘」
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:02:00 -c copy out.mp4
以下範例為剪出「由第1分鐘起,到第2分鐘止 (長1分鐘)」
ffmpeg -i in.mp4 -ss 00:01:00 -to 00:02:00 -c copy out.mp4
轉檔為Youtube的建議格式
影片重編碼
ffmpeg -i in.mkv -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p out.mkv影片、音訊重編碼,加上
-movflags +faststart
ffmpeg -i in.mkv -c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p -movflags +faststart out.mp4
把多個影片一個接一個的合併在一起
有三種選擇,如果不確定要使用哪種方法,請嘗試使用 concat demuxer。
-
concat video filter
如果你的多個資料(影片、音訊等)的參數(像是寬度、高度)不一致,或是格式和編碼方式不同,或者你想要對資料做一些過濾處理的話,就可以使用這個方法。
請注意,這個方法會重新編碼所有的資料。如果不想重新編碼所有的資料,你可以只編碼不符合的那部分資料,讓它們有一致的編碼方式和其他參數。然後使用 concat demuxer 來避免重新編碼所有的資料。ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mkv
-
concat demuxer
如果你不想重新編碼資料,而且你的資料格式不支援直接串接多個檔案(像一般人常用的檔案格式通常不支援直接串接檔案),那你可以使用這個方法。適用在 MP4。(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4
簡單解釋,你需要創建一個 txt 檔,其中列出了要合併哪些檔案,然後把這個 txt 檔傳入 ffmpeg -f concat -
concat protocol
這個方式只適用在支援直接串接多個檔案的格式,像是 MPEG-1、MPEG-2 PS 和 DV 格式。不適用 MP4 格式。ffmpeg -i "concat:input1|input2" -codec copy output.mkv
附錄: mkclean
官方站:
https://www.matroska.org/downloads/mkclean.html
下載點:
https://sourceforge.net/projects/matroska/files/mkclean/
mkclean是一個命令行工具,可以清理和最佳化Matroska(.mkv/.mka/.mks/.mk3d)和WebM(.webm/.weba)這些已被合併的檔案。它會將Element重新排序,將Cues放在前面,這樣你的Matroska文件就可以在網絡上有效率地串流。
mkclean in.mkv out.mkv
延伸閱讀
你好
回覆刪除Twspace-dl
最近會出現
RuntimeError: No guest token found after five retry
https://github.com/Ryu1845/twspace-dl/issues/28
刪除是closed issue,還未release
但docker image有做CI,用docker的話pull image就行
您好 我本身是使用 macos
回覆刪除在官網上用 go install github.com/Kethsar/[email protected] 安裝成功後
輸入指令都會跑出 zsh: command not found: ytarchive
請問要如何解決 謝謝
抱歉,我跟mac不熟
刪除您好,想請問如何用ffmpeg合成ytarchive下載直播出來的兩個ts檔?
回覆刪除正常來說它會自動合併,你可以試試都用-i塞進去
刪除ffmpeg -i video.ts -i audio.ts -c copy out.mkv
大大您好,我是Youtube Segment Downloader的使用者,很感謝您做了如此好用的工具
回覆刪除近日使用這套工具時在按下"開始"後,準備的過程都會閃退
我換了3款電腦下載使用,也重新安裝,換過別的YT影片抓皆無法解決
只好冒昧前來詢問是否有解方
修好了,大概
刪除目前測試了幾部片子皆可正常下載,十分感謝大大的處理,這工具幫我在後製剪片蒐集素材有極大幫助
刪除