分享下各個直播平臺錄播的經驗(更新中)
先列個提綱,等之后在慢慢更新填坑
錄播的原理及其方法論
直接錄屏
如果不討論其他形式的直播,對于普通的音視頻媒介的直播,錄屏就是最直接的也是最后的錄制手段。
本質上,直播的音視頻就是一串以時間排列的信息序列。類似模擬漏洞(Analog hole),無論直播的平臺是什么架構,都需要轉換成音視頻顯示在電腦或手機上,于是就都可以通過錄屏來對音視頻序列進行記錄。錄屏的優(yōu)勢也在于其通用性,只要一個OBS就可以應對所有的直播站點。
錄屏的缺點也很明顯,對電腦的性能要求高、畫質差、有水印、容易受到干擾等。所以除非沒有其他的錄播手段,并不建議使用錄屏的方式錄制直播。
錄屏理論上可以通過Selenium + obs-websocket實現(xiàn)自動化錄制。
瀏覽器抓包
抓包作為一種過渡的手段,非常適合初見一個直播平臺的時候使用。抓包可以在缺少時間研究陌生的直播站點時,盡可能完整地保存直播的音視頻的信息,也可以為后續(xù)利用專門軟件提供數(shù)據(jù)支持。
直播的音視頻是通過網(wǎng)絡進行推流的,所以只要保存下瀏覽器接收到的所有數(shù)據(jù),那么直播的音視頻的信息也就都保存下來了。這樣就可以在之后時間充裕的時候,從記錄下的網(wǎng)絡數(shù)據(jù)中提取音視頻的數(shù)據(jù)流。
抓包的優(yōu)勢在于可以直接抓取音視頻的碼流,避免二次編碼帶來的損失,同時可以讓人在直播結束后再從容地對直播站點和直播數(shù)據(jù)進行分析處理。所有需要知道的都保存下來了,那么也就不用在直播的時候手忙腳亂了。
抓包的缺點也很明顯,以Fiddler抓包為例,一是需要專業(yè)知識來分析和處理抓取的數(shù)據(jù)包,二是抓包獲取的數(shù)據(jù)可能是加密的,這就需要再專門分析如何解密,增大工作量。另外Fiddler無法抓取WebRTC的UDP數(shù)據(jù)包,并且對于B站這種使用HTTP-FLV長連接協(xié)議的站點,F(xiàn)iddler難以完整的抓取和存儲幾個GB大小的請求。????
從sourceBuffer抓取視頻數(shù)據(jù)流(設想)
直播站點獲取并解析完音視頻數(shù)據(jù)后,還需要將這些數(shù)據(jù)放入頁面上的播放器,讓播放器渲染聲音和圖像,這些播放器一般都是基于瀏覽器自帶的HTMLMediaElement實現(xiàn)的,所以只要在數(shù)據(jù)被送入播放器的過程將其復制下來,理論上就可以實現(xiàn)對直播的錄制。
使用專門的錄播軟件進行錄制
當有錄播軟件能用的時候,就優(yōu)先使用錄播軟件。
大部分的直播站點都可以使用現(xiàn)成的軟件進行錄制。這些軟件會模擬瀏覽器發(fā)出的請求,直接獲取直播推流的地址,然后下載音視頻的數(shù)據(jù)流寫入到硬盤上。這一過程基本和下載文件的負荷差不多,所以即便是最低配的云主機或者是十多年前的電腦,都可以輕松地用錄播軟件來錄制直播。
用軟件錄制,優(yōu)點是占用少并且穩(wěn)定可靠,方便實現(xiàn)自動錄制,缺點是只支持軟件支持的站點。

各直播站點的錄播實踐和經驗
B站/Bilibili直播/嗶哩嗶哩直播
B站的直播有很多錄播軟件,但我個人只推薦使用B站錄播姬進行主力錄制。
但就目前而言,錄播姬仍未正式支持HLS,而B站有部分直播間已經測試過僅提供HLS推流(同時也導致海外IP無法觀看),所以對于重要的直播間,可以用blrec等作為備份選項,同時進行錄制(但HLS基本必然錄制的是畫質更差的二壓畫質)。
如果只是自己錄著玩玩,那么用家庭帶寬,隨便選一個電腦、甚至是NAS運行錄播姬程序就可以了。設置里“錄制模式”選擇“標準模式”,然后房間列表添加自己想錄制的房間號,保持這臺電腦一直聯(lián)網(wǎng)開機就可以了。剩下的就是可以根據(jù)個人偏好,打開“彈幕錄制”的“保存彈幕”、“保存彈幕原始數(shù)據(jù)”,以及保存封面等。

那么面向小白的教程到此為止,接下來討論點復雜的。
首先B站的直播相對于其他平臺來說是一個經常會有變動的平臺,所以這里的經驗隨時都可能過時。其次以下的內容展開的角度是投入較多的資源(服務器、時間)來錄制1-2個直播間,以保證錄制的完整,而不是節(jié)約資源來錄制盡可能多的直播間,來追求錄制的范圍。
對于“錄播模式”,我建議設置為“原始數(shù)據(jù)模式”。原因有兩個,一是原始數(shù)據(jù)模式更不容易出錯。錄播只有一次機會,所以應當盡量降低一切風險因素。同時B站已經使用自定義的FLV標準來支持H265推流,目前版本的錄播姬的標準模式不能錄制H265推流,使用標準模式會導致無法錄制。第二個原因使用原始數(shù)據(jù)模式可以在錄制結束后再決定如何進行修復,例如是否自動在跳變處分段,也可以避免強行修復現(xiàn)有修復規(guī)則無法修復的新錯誤。
對不同服務器錄制的錄播文件,我會對各幀(flv tag)的原始數(shù)據(jù)的哈希值進行比對,來選擇沒有缺失的一個進行保存。另外彈幕的錄制有時會出現(xiàn)缺失,其原因一般是和錄播的節(jié)點和彈幕服務器的鏈接短暫的斷開了,導致斷開期間的彈幕會丟失
服務器的選擇方面,基本上可以分為國內服務器(使用B站視頻云的CDN)和國外服務器(使用Akamai的CDN)兩類。在21-22年左右,基本上使用國內服務器錄到的都是完整連貫的錄播,而國外的會不時出現(xiàn)數(shù)秒的缺失或斷開。但從23年年初左右開始,國內的服務器錄制會經常出現(xiàn)斷開和缺失,而國外服務器則一般完整。另外加拿大的網(wǎng)很爛,彈幕服務器經常會斷,建議盡量用美國的。
錄制非二壓原畫
錄制需要cookies的直播

YouTube/油管/Y臺
YouTube作為HLS推流的典型,可以直接使用streamlink進行錄播,也可以用youtube-dl的后繼者yt-dlp進行錄播和下載。
YouTube相較于B站的一個特點是,在直播結束后,直播的鏈接會直接轉變?yōu)殇洸?直播回放,可以立刻觀看和下載錄播。但是需要注意的是,直播結束后會有一個數(shù)小時的轉碼的時期,最大的特征是在此期間,錄播的右側沒有聊天回放。在轉碼期使用yt-dlp可以下載到和直播時同等的畫質的音視頻流,并且不會下載到VP9/opus的二次二壓的碼流,但是yt-dlp只能最多下載從結尾往前2小時的內容。
所以如果在直播結束后用yt-dlp下載錄播,并且這一場直播超過2小時,請務必等待右側的聊天回放欄出現(xiàn)、讓二壓完成后再進行下載。雖然畫質會變差,但是這樣下載的才是完整錄播。如果直播本身不超過2小時則沒這個問題。
yt-dlp下載錄播可以參考如下的參數(shù)
如果使用socks等代理可以根據(jù)服務器的地址和端口再加上代理參數(shù)
需要注意避免觸發(fā)API rate limit
如何錄制彈幕

YouTube的會員限定(會限)的直播/錄播
會限的直播錄制和錄播下載基本和普通的場次是一樣的,區(qū)別是會限需要額外的登錄信息,具體到YouTube就是登陸后的瀏覽器cookies。
向yt-dlp添加cookies的方法相對簡單,可以直接讓yt-dlp自己嘗試從讀C盤,從本地瀏覽器獲取,或者提供cookies文件。
以下載錄播為例,提供--cookies-from-browser后,即可讓yt-dlp使用本地瀏覽器的cookies。用Firefox登錄YouTube后,打開Windows的文件資源管理器,單擊地址欄,輸入“%APPDATA%\Mozilla\Firefox\Profiles”再回車,即可跳轉到存放了Firefox的歷史記錄、cookies等的文件夾。找到xxxx.default-release,把這個名稱復制下來,這個就是要指定yt-dlp使用的對象。然后就可以用yt-dlp下載會限錄播了。
但單獨的cookies文件更適合遠程服務器使用。首先瀏覽器安裝EditThisCookie插件,然后登錄YouTube。打開錄播頁面確認登錄的賬號可以觀看后,打開EditThisCookie,點擊最上面朝右箭頭的圖標(導出cookies),將Netscape格式的cookies導出至剪貼板。打開記事本,粘貼內容,然后保存為youtube-cookies.txt文件(如果保存為其他的文件名,命令中的對應文件名則進行相應調整)。
導出完cookies后,添加--cookies youtube-cookies.txt,即可用yt-dlp下載會限錄播。
streamlink的cookies是使用key=value的格式進行配置,所以需要手動再進行一次轉換,樣例可以參考lovezzzxxx/liverecord的README。這里提供一個我寫的Python腳本實現(xiàn)以供參考
將導出的cookies保存為youtube-config.txt之后,理論上添加--config?youtube-config.txt之后,就可以用streamlink錄制直播了,但我沒有實際遇到錄制會限直播的情況,所以具體建議參照lovezzzxxx/liverecord中對streamlink的cookies的處理。

Twitch/老鼠臺
Twitch是基于HLS的直播平臺,可以直接使用streamlink進行錄制。
如何錄制Twtich的彈幕/實時聊天記錄
TwitCasting/TC
FC2 Live
FC2是一個基于HLS的站點,可以直接使用yt-dlp下載錄播和對直播進行錄制,也可以用streamlink進行錄制。需要注意的是,F(xiàn)C2如果沒有登錄的時候,瀏覽器語言(locale)如果是中文會跳轉到中文特供域名。
FC2自帶防多開機制。沒有登錄的情況下,一個直播間,同一個IP地址只能同時打開一個。新打開相同的頁面會自動導致舊頁面的直播間斷連。所以沒有登錄的情況下,同一臺電腦(IP)不能同時進行錄播和瀏覽器觀看。登錄后的直播間防多開機制應該是根據(jù)賬號而非IP計數(shù)。
注意用yt-dlp下載過往錄播的時候,需要手動修改URL格式,來確保yt-dlp正常匹配識別
另外FC2直播剛開始推流的時候,是先有低畫質,再出高畫質,這一點剛好和B站是反過來的。所以在開始錄制的時間點上需要進行一些取舍:是追求完整,還是追求高畫質
參考的bash錄制腳本:

8181Live
8181Live是一個基于HLS的新站點,比較簡單,可以用streamlink進行錄制。需要注意的是這個站點必須登錄才能進入直播間頁面(并獲取推流鏈接),所以必須通過--config提供cookies才能進行錄制。參考bash錄制腳本:

推特空間/Twitter Space
推特空間無論是否開啟錄播,所有直播均有錄播,以及如何獲取和使用錄播鏈接
ZAIKO(錄播)
AES加密的例子,但是日企的業(yè)務水平
Fantia
聲網(wǎng)的WebRTC方案,投降