分享下各个直播平台录播的经验(更新中)
先列个提纲,等之后在慢慢更新填坑
录播的原理及其方法论
直接录屏
如果不讨论其他形式的直播,对于普通的音视频媒介的直播,录屏就是最直接的也是最后的录制手段。
本质上,直播的音视频就是一串以时间排列的信息序列。类似模拟漏洞(Analog hole),无论直播的平台是什么架构,都需要转换成音视频显示在电脑或手机上,于是就都可以通过录屏来对音视频序列进行记录。录屏的优势也在于其通用性,只要一个OBS就可以应对所有的直播站点。
录屏的缺点也很明显,对电脑的性能要求高、画质差、有水印、容易受到干扰等。所以除非没有其他的录播手段,并不建议使用录屏的方式录制直播。
录屏理论上可以通过Selenium + obs-websocket实现自动化录制。
浏览器抓包
抓包作为一种过渡的手段,非常适合初见一个直播平台的时候使用。抓包可以在缺少时间研究陌生的直播站点时,尽可能完整地保存直播的音视频的信息,也可以为后续利用专门软件提供数据支持。
直播的音视频是通过网络进行推流的,所以只要保存下浏览器接收到的所有数据,那么直播的音视频的信息也就都保存下来了。这样就可以在之后时间充裕的时候,从记录下的网络数据中提取音视频的数据流。
抓包的优势在于可以直接抓取音视频的码流,避免二次编码带来的损失,同时可以让人在直播结束后再从容地对直播站点和直播数据进行分析处理。所有需要知道的都保存下来了,那么也就不用在直播的时候手忙脚乱了。
抓包的缺点也很明显,以Fiddler抓包为例,一是需要专业知识来分析和处理抓取的数据包,二是抓包获取的数据可能是加密的,这就需要再专门分析如何解密,增大工作量。另外Fiddler无法抓取WebRTC的UDP数据包,并且对于B站这种使用HTTP-FLV长连接协议的站点,Fiddler难以完整的抓取和存储几个GB大小的请求。
从sourceBuffer抓取视频数据流(设想)
直播站点获取并解析完音视频数据后,还需要将这些数据放入页面上的播放器,让播放器渲染声音和图像,这些播放器一般都是基于浏览器自带的HTMLMediaElement实现的,所以只要在数据被送入播放器的过程将其复制下来,理论上就可以实现对直播的录制。
使用专门的录播软件进行录制
当有录播软件能用的时候,就优先使用录播软件。
大部分的直播站点都可以使用现成的软件进行录制。这些软件会模拟浏览器发出的请求,直接获取直播推流的地址,然后下载音视频的数据流写入到硬盘上。这一过程基本和下载文件的负荷差不多,所以即便是最低配的云主机或者是十多年前的电脑,都可以轻松地用录播软件来录制直播。
用软件录制,优点是占用少并且稳定可靠,方便实现自动录制,缺点是只支持软件支持的站点。

各直播站点的录播实践和经验
B站/Bilibili直播/哔哩哔哩直播
B站的直播有很多录播软件,但我个人只推荐使用B站录播姬进行主力录制。
但就目前而言,录播姬仍未正式支持HLS,而B站有部分直播间已经测试过仅提供HLS推流(同时也导致海外IP无法观看),所以对于重要的直播间,可以用blrec等作为备份选项,同时进行录制(但HLS基本必然录制的是画质更差的二压画质)。
如果只是自己录着玩玩,那么用家庭带宽,随便选一个电脑、甚至是NAS运行录播姬程序就可以了。设置里“录制模式”选择“标准模式”,然后房间列表添加自己想录制的房间号,保持这台电脑一直联网开机就可以了。剩下的就是可以根据个人偏好,打开“弹幕录制”的“保存弹幕”、“保存弹幕原始数据”,以及保存封面等。

那么面向小白的教程到此为止,接下来讨论点复杂的。
首先B站的直播相对于其他平台来说是一个经常会有变动的平台,所以这里的经验随时都可能过时。其次以下的内容展开的角度是投入较多的资源(服务器、时间)来录制1-2个直播间,以保证录制的完整,而不是节约资源来录制尽可能多的直播间,来追求录制的范围。
对于“录播模式”,我建议设置为“原始数据模式”。原因有两个,一是原始数据模式更不容易出错。录播只有一次机会,所以应当尽量降低一切风险因素。同时B站已经使用自定义的FLV标准来支持H265推流,目前版本的录播姬的标准模式不能录制H265推流,使用标准模式会导致无法录制。第二个原因使用原始数据模式可以在录制结束后再决定如何进行修复,例如是否自动在跳变处分段,也可以避免强行修复现有修复规则无法修复的新错误。
对不同服务器录制的录播文件,我会对各帧(flv tag)的原始数据的哈希值进行比对,来选择没有缺失的一个进行保存。另外弹幕的录制有时会出现缺失,其原因一般是和录播的节点和弹幕服务器的链接短暂的断开了,导致断开期间的弹幕会丢失
服务器的选择方面,基本上可以分为国内服务器(使用B站视频云的CDN)和国外服务器(使用Akamai的CDN)两类。在21-22年左右,基本上使用国内服务器录到的都是完整连贯的录播,而国外的会不时出现数秒的缺失或断开。但从23年年初左右开始,国内的服务器录制会经常出现断开和缺失,而国外服务器则一般完整。另外加拿大的网很烂,弹幕服务器经常会断,建议尽量用美国的。
录制非二压原画
录制需要cookies的直播

YouTube/油管/Y台
YouTube作为HLS推流的典型,可以直接使用streamlink进行录播,也可以用youtube-dl的后继者yt-dlp进行录播和下载。
YouTube相较于B站的一个特点是,在直播结束后,直播的链接会直接转变为录播/直播回放,可以立刻观看和下载录播。但是需要注意的是,直播结束后会有一个数小时的转码的时期,最大的特征是在此期间,录播的右侧没有聊天回放。在转码期使用yt-dlp可以下载到和直播时同等的画质的音视频流,并且不会下载到VP9/opus的二次二压的码流,但是yt-dlp只能最多下载从结尾往前2小时的内容。
所以如果在直播结束后用yt-dlp下载录播,并且这一场直播超过2小时,请务必等待右侧的聊天回放栏出现、让二压完成后再进行下载。虽然画质会变差,但是这样下载的才是完整录播。如果直播本身不超过2小时则没这个问题。
yt-dlp下载录播可以参考如下的参数
如果使用socks等代理可以根据服务器的地址和端口再加上代理参数
需要注意避免触发API rate limit
如何录制弹幕

YouTube的会员限定(会限)的直播/录播
会限的直播录制和录播下载基本和普通的场次是一样的,区别是会限需要额外的登录信息,具体到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脚本实现以供参考
将导出的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进行录制。需要注意的是,FC2如果没有登录的时候,浏览器语言(locale)如果是中文会跳转到中文特供域名。
FC2自带防多开机制。没有登录的情况下,一个直播间,同一个IP地址只能同时打开一个。新打开相同的页面会自动导致旧页面的直播间断连。所以没有登录的情况下,同一台电脑(IP)不能同时进行录播和浏览器观看。登录后的直播间防多开机制应该是根据账号而非IP计数。
注意用yt-dlp下载过往录播的时候,需要手动修改URL格式,来确保yt-dlp正常匹配识别
另外FC2直播刚开始推流的时候,是先有低画质,再出高画质,这一点刚好和B站是反过来的。所以在开始录制的时间点上需要进行一些取舍:是追求完整,还是追求高画质
参考的bash录制脚本:

8181Live
8181Live是一个基于HLS的新站点,比较简单,可以用streamlink进行录制。需要注意的是这个站点必须登录才能进入直播间页面(并获取推流链接),所以必须通过--config提供cookies才能进行录制。参考bash录制脚本:

推特空间/Twitter Space
推特空间无论是否开启录播,所有直播均有录播,以及如何获取和使用录播链接
ZAIKO(录播)
AES加密的例子,但是日企的业务水平
Fantia
声网的WebRTC方案,投降