昨天某人问我如何把 Linux 的桌面分享到腾讯会议,我提了个馊主意:

  1. Linux 上用 obs 推流到 rtmp 服务器
  2. Windows 用 PotPlayer 拉流,全屏播放
  3. 腾讯会议共享这个屏幕

  然后昨晚用阿里云的服务实践了一下,是可行的:

▲ 采用阿里云的流媒体服务。左边屏幕用 OBS 推流,右边屏幕用 PotPlayer 拉流

  但是阿里云的服务不太适合刚刚提到的应用场景。首先,内网的两台机器之间推流拉流,没必要占用宝贵的公网带宽;另一方面,阿里云的流媒体流量费非常贵。

  本文记录了在内网的树莓派上搭建 rtmp 服务器、obs 推流、PotPlayer 拉流或浏览器直接播放的过程。


nginx 搭建 rtmp 服务器

  nginx 有一个模块 nginx-rtmp-module ,可以用来搭建比较完善的 rtmp 服务器。我树莓派的系统是基于 debian 的,可以直接用 apt 安装。如下:

apt install nginx
apt install libnginx-mod-rtmp
systemctl restart nginx
▲ apt 安装 nginx 以及 rtmp 模块

  debian 下默认的 nginx 的模块管理方式,是在 nginx.conf 里面指定包含 modules-enabled 目录内的全体 .conf 文件;以后安装模块,只需要在 modules-enabled 文件夹内放置对应的配置。apt 会帮我们做好这些事。

▲ 在 nginx 的 modules-enabled 目录可以看到安装好的 rtmp 模块

  接下来的步骤照抄网上的博客,在 nginx.conf 里面添加这几句话:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
    
        application live {
            live on;
            record off;
        }

        application hls {
            live on;
            hls on;
            hls_path /var/www/html/hls;
            hls_fragment 5s;
            hls_playlist_length 15s;
            hls_continuous on;
            hls_cleanup on;
            hls_nested on;
        }

    }
}
▲ nginx 配置 rtmp 流媒体服务器

  在网站配置文件里面放这几句话:

location /hls {
	types {
		application/vnd.apple.mpegurl m3u8;
		video/mp2t ts;
	}
        
	autoindex on;
	alias /var/www/html/hls;
	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 -t 测试通过, nginx -s reload 平滑重启服务器。
  扫描一下端口,可以发现 rtmp 端口 1935 已经开放了。


OBS 推流

  在 OBS 中设置推流服务器,往 rtmp://192.168.3.23/hls 推流:

▲ OBS 流设置。密钥可以随便填。

  这里用了招新宣讲会时候的场景。画面是一张图片,音乐是拉取桌面音频。

▲ 推流成功,码率 3177 kb/s

  访问 http://192.168.3.23/hls/test/ ,可以看见 index.m3u8 以及一些切片文件。

  至此完成 nginx 的配置。


PotPlayer 拉流

  很多播放器都支持拉取直播流,我自己比较喜欢用 PotPlayer. 右键 打开 -> 打开链接 ,输入我们的 index.m3u8 地址:  

▲ PotPlayer 设置输入源

  于是就可以拉到视频流了!


html5 直接观看直播

  我们这里用了个外部库 hls.js,在浏览器中播放 m3u8 格式的视频:

<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
<video id="video"></video>
<script>
  if(Hls.isSupported()) {
    var video = document.getElementById('video');
    var hls = new Hls();
    hls.loadSource('http://192.168.3.23/hls/test/index.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
  });
 }
</script>
live.html 代码,利用 hls.js 播放直播视频

  开始推流,刷新网页,过几秒钟就可以在浏览器中看到直播画面了:

▲ 在 Chrome 中观看直播