安装
有的时候会遇到类似的场景:
这时候就会思考,有没有能既清晰又流畅的进行屏幕、视频流的分享呢?很显然直播满足了这一系列条件。所以这里有这么些解决方案:
前两种方案都很简单,三方直播平台开播也很容易,现有的直播服务价格相比按量计费的服务器来说并不贵。
本文讨论最后一种情况,有自己的服务器,希望利用它实现简单的直播推流。
部署的环境选择往往会决定最终的使用体验,本次使用了 Lighthouse 轻量应用服务器中国大陆数据中心的服务器进行,目前在售的最低配置提供了 2 虚拟 CPU, 2 GB 内存和 4 MB 下行带宽。
通常来说,该配置的 CPU 和内存是足够了,带宽取决于希望分享的内容和同时拉流的人数。
如果使用 4000 KBps 码率的直播推流,不进行码率转换和压缩,则可以供另外一个小伙伴进行观看,若使用 2000 KBps 码率进行直播推流,
需要多高的码率和内容、编码方式有较大关联,举个例子顺带吐槽一下 该视频 提供的 “1080P 高码率” 的码率仅仅只有 1000 KBps,其中视频码率只有 825 KBps,大家看的不也很开心吗(
总之,本文使用下配置环境进行配置:
通过网络搜索 Nginx-RTMP,可以获得大量的编译安装的说明,不过其实目前来说并不需要在这么麻烦,直接利用 apt 包管理器就可以了,通过 search 找到需要安装的软件包:
安装 Nginx 和 Nginx-RTMP,为了方便转码,再额外安装 ffmpeg
# 更新软件源
apt update
# apt upgrade -y
# 安装
apt install nginx libnginx-mod-rtmp -y
# ffmpeg (如需转码)
apt install ffmpeg -y
在 GitHub 上查看项目
Nginx-RTMP 的配置需写在 nginx.conf 文件中,当前环境下位于 /etc/nginx/nginx.conf
。
大部分配置在该配置文件中新建 rtmp 模块并写入,少部分配置需要写入该配置文件的 http 模块中。
完整配置参考:https://github.com/arut/nginx-rtmp-module/wiki/Directives
rtmp {
server {
listen 1935;
application vod {
play /var/document/vedios;
}
}
}
rtmp {
server {
listen 1935;
application live {
live on;
}
}
}
该配置下,推流地址为 rtmp://IP_ OR_DOMAIN/live/
,当使用 live 为推流码进行推流时,播放地址为 rtmp://IP_ OR_DOMAIN/live/live
rtmp {
server{
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
push rtmp://target;
}
}
}
利用 ffmpeg 可进行转码操作
rtmp {
server {
listen 1935;
application src {
live on;
exec ffmpeg -i rtmp://localhost/src/$name
-c:a aac -b:a 32k -c:v libx264 -b:v 128K -f flv rtmp://localhost/hls/$name_low
-c:a aac -b:a 64k -c:v libx264 -b:v 256k -f flv rtmp://localhost/hls/$name_mid
-c:a aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_nested on;
hls_variant _low BANDWIDTH=160000;
hls_variant _mid BANDWIDTH=320000;
hls_variant _hi BANDWIDTH=640000;
}
}
}
推流可以使用 OBS、ffmpeg 等工具进行
注:x11grab 在新版的 ffmpeg 中已被移除,给出ffmpeg推流示例:
./ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264\_nvenc -qp 0 -acodec aac -f flv rtmp://IP_OR_DOMAIN:1935/live/live
播放可以采用多种方式,如 ffplay、网页、第三方客户端(如 PotPlayer)等