【本文内容仅限技术研究使用,不对方案导致的任何影响负责】(2021年12月)
首先大概说明一下目前B站直播地区限制的两个关键,一个是开播页面的开播按钮,海外ip点击开播时会提示系统升级,然而这个升级已经持续足足三年之久,原因不言自明。另一个难点是推流本身,在区域限制早期(2019年)获得推流地址后只需要按正常流程使用OBS推流即可,不过现在推流线路本身似乎也有问题。
通过代理可以正常点击开播按钮(包括直播姬),获得直播必要的推流地址和密钥参数,开播后关闭代理,如果可以正常推流那么恭喜,如果推流速度为零,或反复断开,可以继续阅读以下内容。
方案1:全局VPN
直接模拟回国,最省事的解决方案。但想要找到一条带宽足够且稳定的线路是不容易的,在过去的几年了,我测试了4款市面上不同的回国软件(加速器),在软件开始服务初期,信号质量可观,但随着业务的壮大,线路质量都不同程度的受到了影响。另外,这些软件的带宽通常很小,做高画质高码率的直播是相当有压力的。海外回国VPN的价格为20-70元每月,如果直播没有稳定的收益,此方案并不合适。
方案2: 开播后使用SRT协议(推荐)
B站在暗中不断升级着直播服务,相信RTMP流大家已经很熟悉了。B站后来推出过bvc,理论在干扰严重的环境直播效果更好,不过仍然是RTMP,曾在内测阶段在ChinaJoy测试,实际效果并没有可见提升。现在似乎默认全走bvc了。
RTMP基于TCP,TCP协议每个包发送时要和接受端多次通讯,猜测B站可以通过检验头部并拒绝连接的方式使得推流秒断,无法使用。也可能是B站分配的直播推流服务器受代理ip影响,实际推流时过高的延迟直接被拒绝。
最近新支持的SRT协议采用UDP协议,不需要和接受端通讯,类似无线电台,只管发,不管对方收没收到。减少了来回通讯的步骤,也把延迟做到了毫秒级。TCP和UDP协议的区别通过下图可以直观的体现。
图片来源:@LisanneWaifu
TCP协议的RTMP推流出现网络问题时,观众可能会看到画面“鬼畜”(片段反复)。UDP协议的SRT协议推流出现网络问题时观众会看到花屏。在画面完整性要求比较高且网络质量好的情况推荐使用RTMP,对流畅性要求更高优先考虑SRT。
经过测试,开播后使用SRT协议可以正常推流,在距离国内较近的地区如日本,此方法体验应比较好。对于距离更远的地区,往往会因网络连接不稳定导致直播画面频繁开裂(用OBS推SRT协议,状态显示的码率只是推出去的码率,服务器能接到多少包是不确定的)。在很长一段时间里我使用SRT将就着播,至少声音不卡。
方案3: 自建RTMP转发
虽然直接推B站的RTMP地址会出错,但我们可以自己在国内的服务器上搭建RTMP转发服务,推流时,先将画面推送到国内的服务器,再通过处在国内的服务器把流转发到B站。此方案目前仅在一台动态IP的服务器和一台带宽很小的阿里云VPS上测试过,前者本身推流没有问题,可能受动态IP影响,会间歇性连接不到自己的服务器,后者因为带宽只有1M,无法推送可用画面。后续考虑在一台有8M带宽的腾讯云服务器上继续测试。
此方案需要一定的技术能力,且适合已经部署服务器的同学使用,专门为直播部署服务器个人认为有些浪费。
方案4: 自建SRT转发
参考方案3
使用方案3和4需要特别考虑转发服务器本身的网络环境,必要时需要多台服务器接力转发。