写在前面

工作过程中,出于构建大数据屏的需求,需要对工作桌面进行实时直播,对比了市面上可用的桌面直播服务,价格方面都不是很满意,考虑到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

  1. [root@VM_0_2_centos ~]# nginx -V
  2. 查看编译选项,没有找到rtmp
  3. yum remove nginx

因为github下载慢,所以我下载的压缩版本nginx-rtmp-module.zip

  1. unzip nginx-rtmp-module.zip

编译安装nginx+rtmp

  1. tar -zxvf nginx-1.8.1.tar.gz
  2. cd nginx-1.8.1
  3. ./configure --add-module=../nginx-rtmp-module #注意文件位置
  4. make
  5. sudo make install
  6. # 可能遇到的问题
  7. yum install openssl openssl-devel # 中间提示openssl库不存在,可以使用yum安装

最后的安装目录为:/usr/local/nginx

添加nginx环境变量

  1. vim /etc/profile
  2. #文件结尾处添加
  3. export PATH=$PATH:/usr/local/nginx/sbin

启动测试nginx

  1. nginx # 启动nginx

image.png
添加rtmp配置

  1. # vim /usr/loca/nginx/conf/nginx.conf
  2. rtmp {
  3. server {
  4. listen 1935;
  5. chunk_size 4096;
  6. application vod { # 点播服务
  7. play /root/nginx-rtmp/videos/;
  8. }
  9. application live { # rtmp直播服务
  10. live on;
  11. }
  12. application hls { # hls直播服务
  13. live on;
  14. hls on;
  15. hls_path /root/nginx-rtmp/hls;
  16. hls_fragment 5s;
  17. hls_playlist_length 15s;
  18. hls_continuous on;
  19. hls_cleanup on;
  20. hls_nested on;
  21. }
  22. }
  23. }
  24. http {
  25. server {
  26. listen 80;
  27. ## ...省略原有内容
  28. # 配置RTMP状态一览HTTP页面
  29. location /stat {
  30. rtmp_stat all;
  31. rtmp_stat_stylesheet stat.xsl;
  32. }
  33. location /stat.xsl {
  34. root /root/nginx-rtmp/nginx-rtmp-module/;
  35. }
  36. location /hls { #添加视频流存放地址。
  37. types {
  38. application/vnd.apple.mpegurl m3u8;
  39. video/mp2t ts;
  40. }
  41. #访问权限开启,否则访问这个地址会报403
  42. autoindex on;
  43. alias /root/nginx-rtmp/hls; #视频流存放地址,与上面的hls_path相对应,这里root和alias的区别可自行百度
  44. expires -1;
  45. add_header Cache-Control no-cache;
  46. #防止跨域问题
  47. add_header 'Access-Control-Allow-Origin' '*';
  48. add_header 'Access-Control-Allow-Credentials' 'true';
  49. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  50. add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  51. }
  52. ## 省略原有内容
  53. }
  54. }

重新启动并检查端口

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页面查看统计
image.png
可以看到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为例】播放该地址

image.png
输入点播地址:rtmp://域名/vod/1.mp4
image.png
点击确定播放
image.png

开启桌面直播

使用ffmpeg开启桌面直播

ffmpeg release下载地址:https://www.gyan.dev/ffmpeg/builds/

官网提供多个版本,可以下载ffmpeg-release-full
image.png

开启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统计界面查看
image.png
在VLC播放器中查看
image.png

开启HLS桌面直播

ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv -s 640x360 rtmp://域名:1935/hls/cc

#cc名字是自定义的

查看统计
image.png
使用VLC播放器播放直播界面
无法播放,测试不通过,原因不明

使用OBS Studio开启桌面直播

OBS对ffmpeg做了封装,操作起来更友好
image.png


使用腾讯云直播服务

直播对网络带宽要求比较高,上面搭建的服务延迟比较严重,考虑采用腾讯云直播服务
原理:腾讯云搭建了类似于上面的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