如何科学地直播PS4

2022-5-16 18:46| 发布者: Hocassian| 查看: 100| 评论: 0|原作者: 神代綺凜

摘要:
C:\Users\Administrator\Downloads\神代綺凜\2019-10-15-14-33-54-19765170280399-文章归档 - 神代綺凜の萌化小基地-采集的数据-后羿采集器.html

标题

如何科学地直播 PS4

标题链接

https://moe.best/tutorial/ps4-live.html

正文

劫持 twitch 推流,无需采集卡就能直播 PS4 画面,于是又省下了买采集卡的钱(。

Head Pic: #arknights 白面鸮 - UM3c的插画 - pixiv

如何科学的直播 PS4

不用采集卡直播还有一种最简单的方法是使用 PS4 遥控操作(PS4 Remote Play),直接直播在电脑上串流的 PS4 画面,但这有几点缺点

  1. 手柄需要一直连到电脑上,且声音只能通过电脑或手柄播放
  2. 相当于串流游玩,虽然操作延迟很小但始终不可避
  3. Slim 机型(比如我这种穷人甚至买的二手 Slim)只支持 720p 串流,虽然用来直播是可以的,但是自己玩的话体验极差

那么问题就在于如何找到一种独立的“投屏”方法,在不影响游戏体验的情况下得到 PS4 画面

好在 PS4 其实是自带直播推流功能的,支持 twitch 和 youtube,那么我们只要劫持推流就可以拿来推到自己想要的直播平台上了

当然了,这种方法肯定是没有采集卡效果好的,而且 Slim 的推流最高也只支持 720p 60fps

0. 前置准备

想要完成上述操作,我们需要

  1. 一台 openwrt 路由器或自建的软路由
  2. 一个位于内网的 linux,可以是 WSL 或者虚拟机,如果你是软路由的话也可以尝试直接利用
    我个人最推荐 WSL,它最为方便,WSL 大法好
  3. nginx + nginx-rtmp-module

后续示例均为使用 WSL 与 openwrt 路由器

1. 编译带 nginx-rtmp-module 的 nginx

此处假设我们将 nginx 装到/opt下,我编译的是写这篇文章的时候最新的 stable version nginx-1.16.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装依赖 apt-get install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev git # 获取 nginx 源码 cd /opt wget https://nginx.org/download/nginx-1.16.1.tar.gz tar zxvf nginx-1.16.1.tar.gz cd nginx-1.16.1 # 获取 nginx-rtmp-module git clone https://github.com/arut/nginx-rtmp-module.git # configure ./configure --prefix=/opt/nginx --add-module=./nginx-rtmp-module/ --with-http_ssl_module

然后稍等一下,不急着make

使用gcc -dumpversion命令查看一下自己的 gcc 版本,特别是如果你用的是 WSL,预装的 gcc 应该是 8,版本是 7 及以上的必须改 makefile 来忽略 nginx 源码中 switch-case 没加 break 造成的 implicit fallthrough error

编辑objs/Makefile,在下面所示的这行上加个-Wno-implicit-fallthrough

1
2
3
4
# 把 CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g # 改为 CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -Wno-implicit-fallthrough

好,接下来就可以继续了

1
make && make install

2. 配置 nginx

1
2
3
# 当前目录 /opt/nginx-1.16.1 cp nginx-rtmp-module/stat.xsl /opt/nginx/html chown -R www:www /opt/nginx/html

接着修改/opt/nginx/conf/nginx.conf,首先将最前面#user nobody;修改为user www;

在 http 配置块前加上 rtmp 配置

1
2
3
4
5
6
7
8
rtmp { server { listen 1935; application app { live on; } } }

在 http 的 server 配置块中加入 rtmp 状态页面配置,location /直接修改原有即可

1
2
3
4
5
6
7
8
location / { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /opt/nginx/html; }

最好将 http 的 server 中的 listen 也改一下,因为我们编译的这个 nginx 只是拿来做推流劫持的,不会用来做别的事,所以不需要占用 80 端口,改成其他的可以避免以后做什么事需要用 80 端口导致冲突

在此处我改为10080,见下方完整配置

于是最终你的配置文件应该像这样(我删掉了自带注释)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
user www-data; worker_processes 1; events { worker_connections 1024; } rtmp { server { listen 1935; application app { live on; } } } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { # 改一下监听端口 listen 10080; server_name localhost; location / { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /opt/nginx/html; } } }

接着测试一下配置文件,没错误就可以启动 nginx 了

1
2
3
4
# 测试配置 /opt/nginx/sbin/nginx -t # 启动 /opt/nginx/sbin/nginx

3. 劫持 twitch 推流

接下来只要劫持 live.twitch.tv 到 nginx 就行

需要注意的是,不能使用 hosts 方式,这对新版本的 PS4 系统无效,我试了下确实如此,所以我们使用 iptables 做 DNAT

首先用dig或者nslookup查看一下我们当前网络的 live.twitch.tv 被解析到哪里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 以 dig 为例,没有的话需要安装 apt-get install -y dnsutils dig live.twitch.tv # ; <<>> DiG 9.11.5-P4-5.1-Debian <<>> live.twitch.tv # ;; global options: +cmd # ;; Got answer: # ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36451 # ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 # # ;; QUESTION SECTION: # ;live.twitch.tv. IN A # # ;; ANSWER SECTION: # live.twitch.tv. 600 IN CNAME live.video.twitch.tv. # live.video.twitch.tv. 600 IN CNAME live-beta.video.twitch.tv. # live-beta.video.twitch.tv. 600 IN CNAME live-hkg.twitch.tv. # live-hkg.twitch.tv. 600 IN A 45.113.128.181 # live-hkg.twitch.tv. 600 IN A 45.113.128.147 # live-hkg.twitch.tv. 600 IN A 45.113.128.110 # # ;; Query time: 312 msec # ;; SERVER: 192.168.123.1#53(192.168.123.1) # ;; WHEN: Fri Sep 13 15:14:30 CST 2019 # ;; MSG SIZE rcvd: 321

我们可以看到记录有 3 个 IP,都在45.113.128.0/24中,所以我们就 DNAT 这个网段的 1935 端口到 nginx 所在设备的 1935 端口就行

在 openwrt 路由器或软路由上执行

1
iptables -t nat -I PREROUTING -d 45.113.128.0/24 -p tcp --dport 1935 -j DNAT --to-destination 192.168.123.2:1935

我在 WSL 上运行 nginx,所以需要转发到我 PC 上,192.168.123.2是我 PC 的内网 IP,建议在路由器上配置给相应设备分配静态 IP

注意:如果你使用 WSL 或虚拟机,请关闭 Winddows 防火墙,或创建规则放行 1935 端口;若使用内网中的 linux 机器也应当检查防火墙确保端口开放

4. 开启 PS4 直播推流

按下 share 键打开菜单,有个“播放游玩过程”,选 twitch 然后按说明绑定账号,设置推流分辨率之类的

开始推流之后访问 rtmp stat 页面,例如我自己这种部署方式就是 http://127.0.0.1:10080 ,然后应该就能看到 live streams 下方出现了一条记录

如果 app 写的是[EMPTY]的话那么 rtmp 地址就是rtmp://127.0.0.1:1935/app/
否则应该是rtmp://127.0.0.1:1935/app/xxx

然后我们拿一个支持 rtmp 的播放器测试一下,顺利的话就应该能看到 PS4 的画面了(好耶

5. 推流到直播平台

有两种方式,看自己需求选择

(1) 直接推流

这种方式相当于原封不动地推流到其他直播平台,好处是不用再开推流软件,但我自己试的时候不知为何推流画质十分惨烈

修改 nginx 配置,在 rtmp 配置块中的live on;下面添加一行push rtmp://[直播推流带key的完整地址];即可

例如这是推流到B站的示例

1
push rtmp://js.live-send.acg.tv/live-js/?streamname=[name]&key=[key];

修改完配置只要/opt/nginx/sbin/nginx -s reload即可重载配置

(2) 使用 obs 再推流

大部分情况下你可能想用 obs 做些处理再推流,这很简单,只要添加“媒体源”,去掉“本地文件”勾选,在“输入”中贴上 rtmp 地址即可

6. 自启动

nginx 方面

普通 linux 上自启动 nginx 应该不用我多说,改/etc/rc.local

若使用 WSL,你可以在 PC 上创建一个 vbs 脚本,例如nginx-rtmp.vbs,内容如下

1
2
Set ws = CreateObject("Wscript.Shell") ws.run "wsl /opt/nginx/sbin/nginx", vbhide

然后把这个脚本扔到 Windows 的启动目录C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup即可

使用 vbs 的原因是 vbhide 可以让命令执行的时候不会有一个 cmd 窗一瞬出现影响观感

iptables 方面

这一方面情况比较复杂,只是路由器启动时加 iptables 规则的话,可以简单的写在路由器启动脚本里就行

但有些时候,例如启动 ss,可能会清空你的 nat 表,这时候需要重新添加,总之就看你自己实际情况将命令也放在 ss 启动脚本里什么的

一劳永逸的简便的方法是写个守护脚本,我就不贴脚本了,因为我自己都还懒得去写(

参考

搬瓦工VPS优惠套餐,建站稳如狗,支持支付宝,循环出账94折优惠码BWH26FXH3HIQ
年付$28CN2线路,1核/512M内存/10G硬盘/500GB@1Gbps【点击购买】(经常售罄,请抓紧机会)
年付$47CN2线路,1核/1G内存/20G硬盘/1T@1Gbps【点击购买
最后修改:2019 年 09 月 15 日 07 : 42 PM
如果觉得我的文章对你有用,请随意赞赏

文章信息

中二病患者: 神代綺凜  发布时间:2019 年 09 月 13 日  913 次浏览   11 条评论  6918 字数 分类: 教程


路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部