文章目录
  1. 1. 原理
  2. 2. 实现步骤
    1. 2.1. 获取ip,并绑定到网卡上
    2. 2.2. 编译安装nginx
    3. 2.3. 配置ps4
  3. 3. 碎碎念
  4. 4. 广告
  5. 5. 参考文档

嗯,这么两个话题参杂在一起确实有点怪。最近买了台式机,为了不浪费我16G的内存,果断搞了个Linux的虚拟机作为开发机。选择系统时没有用常用的debian/ubuntu,选择了自己比较熟悉的CentOS系列,然后正好顺便试试最新的CentOS 7。然后发现坑了,7里很多系统管理规则都和6.x不一样了,特别是网络有关的部分。
为了实现直播写码月入百万的梦想,必须得开搞直播啊,作为一个屌丝码农,自然买不起采集卡。之前在网上看到过劫持PS4自带的twitch转播的帖子,于是果断操练一把。

原理

最早ps4劫持twitch流量到斗鱼其实非常简单,只需要搭建带ngx-rmtp模块的nginx,并且在路由器把live.twitch.tv解析到nginx上即可。但后来系统更新之后这个方法就不能用了,看了这两篇帖子之后也不是说的特别详细,而且比较详细的how to do还是基于windows的,对于我这种windows只用于打游戏的人来说还是linux熟悉些。目前来说,要劫持twitch流量必须对相关的ip做劫持。

实现步骤

获取ip,并绑定到网卡上

1
2
# 得到ip列表
nslookup live.twitch.tv | perl -ne 'if(m/^Address:\s+(\d+\.\d+\.\d+\.\d+)$/) { print $1, "\n" }' > ip.txt

然后根据ip生成全部的网卡配置文件,这里用一个perl脚本来实现,我在虚拟机里的网卡是enp0s3,大家可以根据自己实际的网卡设备名来改。

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
#!/usr/bin/env perl
use strict;
use warnings;
my $i = 0;
while (defined (my $line = <STDIN>)) {
open OUT, '>', "/etc/sysconfig/network-scripts/ifcfg-enp0s3:$i";
chomp $line;
print OUT "TYPE=Ethernet\n";
print OUT "BOOTPROTO=static\n";
print OUT "IPV4_FAILURE_FATAL=no\n";
print OUT "IPV6INIT=yes\n";
print OUT "IPV6_AUTOCONF=yes\n";
print OUT "IPV6_DEFROUTE=yes\n";
print OUT "IPV6_PEERDNS=yes\n";
print OUT "IPV6_PEERROUTES=yes\n";
print OUT "IPV6_FAILURE_FATAL=no\n";
# 这里需要改的是两个设备名,改成自己实际的设备名,还有上面的网卡配置文件名
print OUT "DEVICE=enp0s3:$i\n";
print OUT "NAME=enp0s3:$i\n";
print OUT "ONBOOT=yes\n";
print OUT "IPADDR=$line\n";
print OUT "NETMASK=255.255.255.255\n";
print OUT "DNS1=192.168.199.1\n";
close OUT;
$i++;
}

重启网络之后,应该就已经用上了这几个ip了,6.x年代重启网络一般是service network restart,但是到了7.x年代引入了一个叫做systemctl的命令,虽然老命令也兼容,但实际执行的是systemctl restart network,不过我还是比较习惯用service相关的命令。之后就是开启Linux的路由功能,编辑/etc/sysctl.conf文件,在末尾添加:

1
2
3
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
kernel.sysrq = 0

然后执行sysctl -p /etc/sysctl.conf应用配置,再给iptables添加转发功能,并开启80/1935端口,以便等下nginx连接。

1
2
3
iptables -A FORWARD -j ACCEPT
# 改成自己的网卡名
iptables -t nat -A POSTROUTING -j MASQUERADE -o enp0s3

编译安装nginx

1
2
3
4
5
6
wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar zxvf nginx-1.6.2.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git
cd nginx-1.6.2
./configure --add-module=../nginx-rtmp-module --with-http_ssl_module --prefix=/opt/nginx
make && make install

编译安装好nginx之后开始配置nginx,打开/opt/nginx/conf/nginx.conf,首先在最外层(和http同级)添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rtmp {
server {
listen 1935;
chunk_size 131072;
max_message 256M;
application app {
live on;
record off;
meta copy;
# 下面改成自己的stream key,除了斗鱼其他直播网站也一样能用,改下url就行
push rtmp://send1.douyutv.com/live/[stream key]];
}
}
}

之后为了看到统计状态,还要配置一下rtmp模块的统计,先将/path/to/nginx-rtmp-module/stat.xsl拷贝到/opt/nginx/html/下,然后在http下的server下添加两个handler:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#This URL provides RTMP statistics in XML
location /stat {
rtmp_stat all;
# Use this stylesheet to view XML as web page
# in browser
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
# XML stylesheet to view RTMP stats.
# Copy stat.xsl wherever you want
# and put the full directory path here
root /opt/nginx/html/;
}

启动nginx如果1935端口已经监听,那么服务端的工作就已经配置好了

配置ps4

配置一下ps4的网络,网关设置为linux机器的ip地址,然后dns设置一个设置路由器的ip就行了。接下来打开游戏,按下share键,选择twitch分享就可以将画面分享到斗鱼上了。试了一下,我这里上传应该是1m的,画质选中就不卡,但就是好模糊,还是采集卡靠谱一些,不过用这个方法省钱啊!

碎碎念

CentOS 7的系统管理改了好多,虽然老的配置方式还是兼容的,但还是感觉有点陌生。不过好处是gcc是4.8.2的,kernel是3.10.0的,相对公司用的6.4还是更新不少。不过安装界面也改了不少,选minimal安装好像不能自定义需要哪些包了,但也还能接受吧。

广告

之前斗鱼直播室n久没播被关了,然后客服打不开,因为绑定过身份证又不能注册新的,就死锁了。后来某Jim勾搭上了一个斗鱼的rd,然后终于把房间解锁了!http://www.douyutv.com/ushuaia,不定期播出,玩一些主机游戏或者用pc玩一些单机游戏。最近可能会播cod 11日常被吊打、风暴英雄打电脑做金币赚日常(对,你没看错)、恶灵附身、龙腾传说3审判等等,当然最重要的是偶尔插播写代码,不过主播是哑巴,从来不会说话的!

参考文档

  1. 无需HDMI采集卡,PS4直播功能破解,支持录制
  2. 手把手教你搭建Windows环境PS4直播服务器
  3. nginx-rtmp-module
  4. 斗鱼直播室
文章目录
  1. 1. 原理
  2. 2. 实现步骤
    1. 2.1. 获取ip,并绑定到网卡上
    2. 2.2. 编译安装nginx
    3. 2.3. 配置ps4
  3. 3. 碎碎念
  4. 4. 广告
  5. 5. 参考文档