年前入手了树莓派4b+,一直没有时间去折腾,年后回来想一边玩ps4一边开直播的。由于一些众所周知的原因,国内的视频流无法直接推twitch和youtube,而ps4本身也没有支持国内视频平台的推流功能。之后我查了下ps4在国内开直播在硬件上需要多买一块采集卡,价格从几百元到上千元不等,抱着一个折腾的想法准备去研究一下如何低成本将ps4直播到国内平台。

在我一番搜索下,发现其实很早就有前辈尝试过通过本地dns劫持或者通过软路由的方法,转发RTMP流来实现国内平台的直播。

准备材料

  • 树莓派 * 1 (需自行配置好ssh登陆/nvc等登陆)
  • 网线 * 1 (因为在树莓派上推流是基于eth0这张网卡的,当然wlan0应该也可以,回头我会尝试下)
  • 一个局域网共享的梯子代理 (twitch在国内被墙) * 1
  • obs (非必须,但若要使用需自行选择对应平台安装好)
  • twitch账号 * 1 + 斗鱼账号(开通直播功能) * 1

原理/方案

我参考了 ps4broadcast 这个仓库的实现,在其基础上进行了修改。里面的实现思路是可行的,而且在其基础上可以进一步定制,进行obs编辑(比如你想露脸)。实现多输入混流后再推到斗鱼/bilibili等国内平台。

我们在树莓派上新建了一个虚拟网卡,同时配置树莓派的iptables进行端口转发,在这个网卡的网段上所有的rtmp流都会被转发到nginx。

同时树莓派上启动一个nginx服务去接受rtmp流(需要nginx编译安装rtmp模块),nginx会将rtmp流推送到斗鱼上。
在PS4侧,手动配置将PS4的ip地址连接到这个虚拟网卡的网段上,这样就可以劫持由PS4发送的rtmp流。

于是有了下面的rtmp流图:

      |-----|
      | PS4 |
      |-----|
  192.168.200.xxx
        |
        | rtmp stream => raspberry pi
        |
        v
|-------------------------|
|       raspberry pi      |
|-------------------------|
| virtual interface(ethx) |
|  192.168.200.xxx        |
|-------------------------|
        |
        | raspberry pi iptables routing
        | (prerouting => forward)
        |  rtmp stream => nginx(raspberry)
        |
        v
|-------------------------|
|       raspberry pi      |
|-------------------------|
| nginx(rtmp module live) |
|-------------------------|
        |
        | rtmp stream => douyu
        |
        v
    rtmp addr

明白了原理就可以为所欲为,在其基础上拓展,加入obs来将直播内容进行丰富。如果仅是上述方案执行下来,你只能直播游戏内容,包括游戏画面/游戏声音/你本人的语音(联机语音待测,但应该是一起播放的),而你如果要播放这些以外的内容,比如想要在直播内容外套一个小窗口,有固定/动态的侧边栏给自己打点广告(恰饭),而且基本的需求是加个摄像头来进行露脸直播(我还是太自信了)或者加一个外接话筒来采集音源,这时候你需要obs

obs简单介绍下其一部分功能是将多个rtmp协议的流通过screen(窗口)编辑来产生一条重新编码的新的rtmp流,并推送出去(所谓的混流),在主播中应用广泛。obs是开源软件。

过程

接线

树莓派以4b+这个型号来进行说明,之前其他型号的接线可能需要的转接头(适配模组比如网卡)需要自备

树莓派上电开机,把网线插入网口。如果接入屏幕,需要再准备一跟miniHDMI - HDMI的线,我的是在淘宝绿盟买的。

因为要进行后续的树莓派上的安装步骤,要获取ip才可以,一个比较简单的方法是利用ARP协议完成。
接网前,在接入了局域网(跟你树莓派的那根网线处于同一个LAN)的电脑上执行arp -a会进行局域网的arp扫描;然后网线插上后,树莓派4b就可以正常联网,这时候你对于树莓派可能还是处于失控状态,再此在电脑上arp -a扫描,查看新增的那个ip,基本就是你树莓派的ip了,远程ssh/nvc进去就可以(假设你没有接屏幕,也没有外设键盘之类的,ps:外设键盘没屏幕你需要真*盲打)

当然如果你有键盘(最好是usb的)和屏幕也可以直接插上线,然后ctrl+alt+t打开terminal,全程键盘控制就可以。

由于我只有一个Dell屏幕(想要65寸4KHDR),我的方案是屏幕接PS4,树莓派ssh进去,全程mac上做事情。

编译安装nginx

在nginx编译安装的过程中基本都会遇到make过程的错误。
这是因为gcc在编译过程中遇到错误而造成编译中断,你可以选择在遇到错误的文件出加入/* fall through */ 这种注释来绕过去,但是更推荐在configure阶段加入 --with-cc-opt="-Wimplicit-fallthrough=0"这个option。

系统/软件版本明细:


树莓派型号:4b+ 4G

os:Raspbian Buster with desktop and recommended software Kernel version:4.19

nginx: http://nginx.org/download/nginx-1.17.0.tar.gz

nginx-rmtp-module: https://github.com/arut/nginx-rtmp-module

启动服务/开启直播

主要步骤参考 ps4broadcast

若只是简单推送游戏画面,按照上述仓库中的步骤是可以做到的,但是若是要连接obs也很简单,因为rtmp已经被路由到了树莓派本地,只要配置上就可以拿到流数据进行编辑,然后再推出去(这时候已经不需要nginx进行推流了)

这部分之后可能会再补充进具体步骤

尝试ps4开启直播/debug

你在ps4上启动直播时,ps4本身会去请求/解析twitch,这个过程不通过的话你会遇到网络错误, 比如你选择分享游戏画面后几秒后,PS4弹出CE-35340-5错误,这基本都是因为你ps4无法连接twitch造成的,你需要给PS的联网加一个proxy(翻墙),这是文章开头我提到的一个局域网共享的梯子代理, 你可以选择ss(已经不安全,很容易被识别)或者v2ray。

mac下的v2ray选择share over LAN。默认端口是8001, ip就是你mac下的ip。当然更好的方式是在树莓派上开代理服务。

CE-33138-8这个错误码基本是直播启动成功,推流失败了, 我暴力的理解为rtmp协议的超时错误在ps4上的体现。需要检查下nginx/obs是否正常工作。





PS

  1. 本来是要贴几张图的,但是最近在找新图床,微博图床的chrome插件不推荐使用,会在后台恶意使用你微博的登陆session去各种关注转发点赞。已经被老子举报了
  2. 欢迎大家来我的直播间: 传送门
  3. 主要在晚上/周末直播ps4游戏,平时看看视频也可能直播, 之后可能会考虑搞个摄像头持续直播街道

references: