写在前面
工作过程中,出于构建大数据屏的需求,需要对工作桌面进行实时直播,对比了市面上可用的桌面直播服务,价格方面都不是很满意,考虑到ffmpeg本身可以实现桌面推流,从原理上讲,只需要搭建一个rtmp服务器接收推流,然后客户端利用ffmpeg工具进行桌面(窗口)推流即可完成桌面直播效果,然后将直播地址rtmp嵌入到H5页面就能满足目前需求。基于此,尝试探索桌面直播服务。
ningx + rtmp模块搭建流媒体服务器
利用nginx + rtmp模块搭建rtmp服务器,rtmp模块属于第三方开源模块,下载地址:
wget http://nginx.org/download/nginx-1.8.1.tar.gz git clone https://github.com/arut/nginx-rtmp-module.git
因为之前使用yum安装过nginx,查看是否已有rtmp模块,如果没有,则卸载nginx
[root@VM_0_2_centos ~]# nginx -V
查看编译选项,没有找到rtmp
yum remove nginx
因为github下载慢,所以我下载的压缩版本nginx-rtmp-module.zip
unzip nginx-rtmp-module.zip
编译安装nginx+rtmp
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --add-module=../nginx-rtmp-module #注意文件位置
make
sudo make install
# 可能遇到的问题
yum install openssl openssl-devel # 中间提示openssl库不存在,可以使用yum安装
最后的安装目录为:/usr/local/nginx
添加nginx环境变量
vim /etc/profile
#文件结尾处添加
export PATH=$PATH:/usr/local/nginx/sbin
启动测试nginx
nginx # 启动nginx
添加rtmp配置
# vim /usr/loca/nginx/conf/nginx.conf
rtmp {
server {
listen 1935;
chunk_size 4096;
application vod { # 点播服务
play /root/nginx-rtmp/videos/;
}
application live { # rtmp直播服务
live on;
}
application hls { # hls直播服务
live on;
hls on;
hls_path /root/nginx-rtmp/hls;
hls_fragment 5s;
hls_playlist_length 15s;
hls_continuous on;
hls_cleanup on;
hls_nested on;
}
}
}
http {
server {
listen 80;
## ...省略原有内容
# 配置RTMP状态一览HTTP页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /root/nginx-rtmp/nginx-rtmp-module/;
}
location /hls { #添加视频流存放地址。
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
#访问权限开启,否则访问这个地址会报403
autoindex on;
alias /root/nginx-rtmp/hls; #视频流存放地址,与上面的hls_path相对应,这里root和alias的区别可自行百度
expires -1;
add_header Cache-Control no-cache;
#防止跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
## 省略原有内容
}
}
重新启动并检查端口
nginx -s reload
netstat -nap | grep LISTEN
查看 80和1935端口
查看rtmp状态统计
rtmp模块自带状态统计功能,在nginx中配置查看统计【上方已配置】
# 配置RTMP状态一览HTTP页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /root/nginx-rtmp/nginx-rtmp-module/;
}
访问stat页面查看统计
可以看到nginx中配置的三项:点播,rtmp直播,hls直播
测试点播服务
nginx的rtmp中配置了点播服务(下方代码),先测试是否可用
application vod { # 点播服务
play /root/nginx-rtmp/videos/;
}
在配置的点播目录【/root/nginx-rtmp/videos】中放入1.mp4,此时该文件的点播地址就是:
rtmp://域名/vod/1.mp4
使用播放器【smplayer,vlc,potplayer都可以,此处以smplayer为例】播放该地址
输入点播地址:rtmp://域名/vod/1.mp4
点击确定播放
开启桌面直播
使用ffmpeg开启桌面直播
ffmpeg release下载地址:https://www.gyan.dev/ffmpeg/builds/
官网提供多个版本,可以下载ffmpeg-release-full
开启rtmp桌面直播
ffmpeg帮助文档:https://ffmpeg.org/ffmpeg.html
ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv -s 640x360 rtmp://域名:1935/live/test
# test名字是自定义的
# 640x360是选的最小输出分辨率,因为带宽不够
在rtmp统计界面查看
在VLC播放器中查看
开启HLS桌面直播
ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv -s 640x360 rtmp://域名:1935/hls/cc
#cc名字是自定义的
查看统计
使用VLC播放器播放直播界面
无法播放,测试不通过,原因不明
使用OBS Studio开启桌面直播
OBS对ffmpeg做了封装,操作起来更友好
使用腾讯云直播服务
直播对网络带宽要求比较高,上面搭建的服务延迟比较严重,考虑采用腾讯云直播服务
原理:腾讯云搭建了类似于上面的nginx+rtmp服务,对外提供推流地址等,因为强大的服务器带宽和CDN技术,所以选择他
具体,查看腾讯云直播文档
对外的直播地址如下:
播放地址 (RTMP) rtmp://live.tall.wiki/live/cc
播放地址 (FLV) http://live.tall.wiki/live/cc.flv
播放地址 (HLS) http://live.tall.wiki/live/cc.m3u8
播放地址 (UDP) webrtc://live.tall.wiki/live/cc