Pages

Sunday, 30 August 2020

一个支持直播的视频程序:NodeTube

 取自官方的项目介绍:NodeTube是YouTube的开源替代品,可提供视频,音频和图像上传,实时流媒体和内置获利功能。

官方没有详细的文档,自己部署的时候遇到很多坑,这里记录一下。另外吐槽一下这个程序的前端属实是有点简陋。不过反正能用,开源的嘛白嫖也不指望个啥。

系统debian10,安装nodejs10/mongodb/redis:

apt -y update
apt -y install build-essential gnupg curl wget git
curl -sL https://deb.nodesource.com/setup_10.x | bash -
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | apt-key add -
echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main" | tee /etc/apt/sources.list.d/mongodb-org-4.2.list
apt -y update
apt -y install nodejs mongodb-org redis-server

注意nodejs的版本只能是10,其他版本跑不起来或者跑起来有问题。

安装nginx/certbot,如果要直播支持还需要安装rtmp模块:

apt -y install nginx python-certbot-nginx libnginx-mod-rtmp

启动mongodb/redis,以及设置一下这些程序的开机自启:

systemctl start mongod redis
systemctl enable nginx mongod redis

现在拉取项目文件/安装依赖:

cd /opt
git clone https://github.com/mayeaux/nodetube
cd nodetube
npm install

修改程序的配置文件:

nano .env.private

如下位置需要改动:

DOMAIN_NAME_AND_TLD='https://nodetube.imlala.best'
INSTANCE_DOMAIN_NAME='nodetube.imlala.best'

如果你需要直播功能,还需要更改另一个配置文件:

nano .env.settings

其中要改动的位置如下:

LIVESTREAM_APP=true
NODE_ENV='production'
RUN_NGROK=false

修改目录/文件的所有者:

chown -R www-data:www-data /opt/nodetube

接着新建一个systemd服务文件:

nano /lib/systemd/system/nodetube.service

写入如下配置:

[Unit]
Description=nodetube

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/nodetube
ExecStart=/usr/bin/npm start
Restart=always

[Install]
WantedBy=multi-user.target

启动以及设置开机自启:

systemctl start nodetube
systemctl enable nodetube

编辑nginx的主配置文件:

nano /etc/nginx/nginx.conf

在文件的末尾加入直播需要的rtmp配置:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
            on_publish http://127.0.0.1:3000/livestream/on-live-auth;
            on_publish_done http://127.0.0.1:3000/livestream/on-live-done;
            hls on;
            hls_path /opt/nodetube/hls;
            hls_fragment 10s;
        }
    }
}

接着新建一个nginx站点配置文件用于反向代理:

nano /etc/nginx/conf.d/nodetube.conf

写入如下配:

server {
      listen 80;
      server_name nodetube.imlala.best; # 换成你的域名
      client_max_body_size 0;
      root /opt/nodetube;

      location /uploads/ {
          gzip off;
          sendfile           on;
          sendfile_max_chunk 1m;
          tcp_nopush on;
          try_files $uri @redirect;
      }

      location @redirect {
          proxy_pass http://127.0.0.1:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      }

      location / {
          proxy_pass http://127.0.0.1:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

接下来用certbot签一个ssl证书:

certbot --nginx --agree-tos --no-eff-email --email xxxxx@qq.com

证书签好了之后,由于这个程序直播界面有一个基于websocket的聊天功能是用的自签证书,这里需要把我们的证书替换掉自签证书,否则聊天功能不能正常使用:

cd /opt/nodetube/keys
mv server.crt server.crt.bak
mv server.key server.key.bak
cp /etc/letsencrypt/live/nodetube.imlala.best/fullchain.pem server.crt
cp /etc/letsencrypt/live/nodetube.imlala.best/privkey.pem server.key

给予正确的文件所有者,否则程序运行的时候报错:

chown www-data:www-data server.crt
chown www-data:www-data server.key

最后重启一下nodetube即可:

systemctl restart nodetube

打开你的域名.

第一个注册的用户自动成为管理员,直播功能,在MY ACCOUNT-Livestreaming.

OBS和FFMPEG推流的方法都在页面内有介绍,自己看着设置就行了。

--------------

一个极易部署的流媒体服务:Node-Media-Server


现在有很多自建流媒体服务器的方法,最常用的应该是Nginx,但如果是自己想体验一下的话,这个Node-Media-Server比Nginx配置起来要简单很多,而且还有一个简单的WEB面板可以方便的查看一些信息。

这里使用Docker的方式部署,首先安装Docker

curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

一条命令即可完成部署:

docker run -d -p 1935:1935 -p 8000:8000 --restart=always --name nms illuspas/node-media-server

然后我们需要进到容器内,做一些更改:

docker exec -it nms /bin/sh

编辑:

vi app.js

找到下面这一段,更改默认的管理员密码,然后把publish改为true,最后把secret也改一下,例如:

  auth: {
    api: true,
    api_user: 'admin',
    api_pass: 'abcdefg',
    play: false,
    publish: true,
    secret: 'x1x2x3x4x5vhvhkttid'
  },

这样做的话是让推流有一个鉴权验证,不做验证的话任何人知道你这个服务器的地址都能用你这台机器推流,这样会造成滥用。

改完之后退出容器并重启:

exit
docker restart nms

如果上面的重启报错,回显类似什么iptables/DNAT啥的,就直接重启Docker服务吧:

systemctl restart docker

因为我们给推流做了一个鉴权验证,这个时候我们需要计算一下推流的地址,首先要定义一个推流地址过期的时间,这里我假设地址在2019年的7月1日过期,那么将时间戳换算成unix的类型:

date -d "2019-07-01 00:00:00" +%s

执行上述的命令后,得到的unix时间戳是:

1561939200

然后我们把时间戳和之前在app.js内配置的secret进行一次md5加密,格式如下:

echo -n "/live/test-1561939200-x1x2x3x4x5vhvhkttid" | md5sum

注:其中的test是可以自己随便更改的,你这里可以理解为这是一个直播间的名字。

执行完上面的命令得到的md5值是:

2e99dbb982cd4bb0edd485a2d249745c

那么最终我们的推流地址就是:

rtmp://vpsip/live/test?sign=1561939200-2e99dbb982cd4bb0edd485a2d249745c

服务端这边就部署完成了,下面简单说一下怎么用FFMPEG/OBS推流。

安装FFMPEG,这边一切从简,直接用FFMPEG的静态包:

wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xJf ffmpeg-release-amd64-static.tar.xz
cd ffmpeg-4.1.3-amd64-static
cp ffmpeg /usr/bin && cp ffprobe /usr/bin && cp qt-faststart /usr/bin

然后随便找个视频文件测试一下:

ffmpeg -re -i 230OREC-315.mp4 \
-c:v libx264 -preset superfast -tune zerolatency \
-c:a aac -ar 44100 -f flv rtmp://vpsip/live/test?sign=1561939200-2e99dbb982cd4bb0edd485a2d249745c

现在我们可以访问一下WEB面板看看推流是否正常:

http://vpsip:8000/admin/

这个媒体服务器支持很多种格式,像什么FLV/HLS/DASH都是支持的,相应的拉流地址:

http://vpsip:8000/live/STREAM_NAME.flv
ws://vpsip:8000/live/STREAM_NAME.flv
http://vpsip:8000/live/STREAM_NAME/index.m3u8
http://vpsip:8000/live/STREAM_NAME/index.mpd

自己弄个简单的html页面或者套个Dplayer都是可以的,这里就不多BB了。。这样一个私人直播服务器就搭建完成了。。

参考文献:

https://github.com/illuspas/Node-Media-Server/blob/master/README_CN.md

-----------------------------------------

Restreamer:免费的流媒体服务器

这个东西貌似主要用途是帮助你把网络摄像头的视频流快速传到Youtube等提供直播的平台,但它也内置了一个用NGINX实现的RTMP服务器,也可以拿来做普通的直播。

安装docker:

apt -y update
apt -y install curl
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

然后使用下面的命令启动即可:

docker run -d --restart always \
     --name restreamer \
     -e "RS_USERNAME=admin" -e "RS_PASSWORD=cvbm" -e "RS_TOKEN=cvbm"\
     -p 8080:8080 \
     -p 1935:1935 \
     -v /mnt/restreamer/db:/restreamer/db 
     datarhei/restreamer:latest

其中RS_PASSWORD是WEB的密码,RS_TOKEN是推流的鉴权验证。

访问WEB面板:

http://your-device-ip:8080

输入你刚才启动容器时设置的账号密码登录.

----------------------------------

Owncast:一个人的直播间

owncast是一个单用户的直播工具,带有聊天功能。

程序转码需要用到ffmpeg,建议在一台性能稍好的VPS上安装,安装基本工具:

apt -y update
apt -y install ffmpeg unzip nginx python-certbot-nginx supervisor 
systemctl start supervisor nginx
systemctl enable supervisor nginx

下载解压二进制文件:

mkdir -p /opt/owncast && cd /opt/owncast
wget https://github.com/owncast/owncast/releases/download/v0.0.2/owncast-linux-0.0.2.zip
unzip owncast-linux-0.0.2.zip

新建配置文件:

nano config.yaml

写入如下配置:

ffmpegPath: /usr/bin/ffmpeg
webServerPort: 8080

instanceDetails:
  name: imlala
  title: MapleStory Solo Lotus
  summary: "Welcome"
  extraUserInfoFileName: "/static/content.md"

  logo:
    small: /img/logo128.png
    large: /img/logo256.png

  tags:
    - game
    - music
    - tech

  socialHandles:
    - platform: github
      url: http://github.com/owncast/owncast
    - platform: mastodon
      url: http://mastodon.something/owncast

videoSettings:
  chunkLengthInSeconds: 5
  streamingKey: password
  offlineContent: static/offline.m4v
  streamQualities:
    - low:
      videoBitrate: 400
      scaledWidth: 600
      audioPassthrough: true
      encoderPreset: veryfast

    - medium:
      videoBitrate: 800
      encoderPreset: fast

    - high:
      videoBitrate: 2000
      encoderPreset: faster

如果你只想开箱即用的话,修改streamingKey后面的值即可,这是你的直播密码。

其他的配置可参考如下地址的说明:

https://owncast.online/docs/configuration/

接下来新建一个supervisor配置文件用于守护owncast的进程:

nano /etc/supervisor/conf.d/owncast.conf

写入如下配置:

[program:owncast]
priority=1
directory=/opt/owncast
command=/opt/owncast/owncast
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/owncast.log

更新supervisor配置即可启动owncast:

supervisorctl update

接下来新建nginx站点配置文件用于反向代理:

nano /etc/nginx/conf.d/owncast.conf

写入如下配置:

server {
    listen      80;
    server_name owncast.imlala.best;

    location / {
        proxy_pass         http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $http_host;
    }
}

使用certbot签一个ssl证书:

certbot --nginx --agree-tos --no-eff-email --email example@qq.com

推流地址:

rtmp://owncast.imlala.best/live

流名称就是你在config.yaml内设置的streamingKey密码。

---------------

相关帖子:https://briteming.blogspot.com/2016/09/nginx.html

No comments:

Post a Comment