node-stream 使用分享

基于Node.js 的本地直播应用

今天介绍一个开源项目node-stream,该项目由开发者waleedahmad开发,采用MIT协议在Github开源。 node-stream 利用Node.js实现了一个简易的本地直播平台。该项目支持从推流软件(OBS等)接收RTMP流并转码为HLS流在浏览器中播放。该项目分为服务端和客户端,服务端负责接收RTMP流和转码,客户端负责显示播放页面,同时该项目支持简单的帐号管理。

本文将讲述 node-stream 的部署和使用。对项目本身构建感兴趣的伙伴可以查看项目开发者 waleedahmad 写的文章 Building Live Streaming App with Node.js and React

原版的node-stream的安装使用

部署node-stream开发环境

以 Ubuntu

  • 安装Node.js开发环境

  • 安装 ffmpeg

    $ sudo apt install ffmpeg
  • 安装 mongodb

    注意!Ubuntu提供的 mongodb 包并非由MongoDB公司维护,并且与官方的 mongodb-org 包有冲突。如果您已经在Ubuntu系统上安装了 mongodb 包,那么在执行这些说明之前,必须先卸载 mongodb 包。否则可能会出现难以预计的问题,导致mongodb无法正常运行。

    各操作系统mongodb官方安装教程:链接

配置和与运行node-stream

  1. 从github上下载 node-stream 源码

    $ git clone https://github.com/waleedahmad/node-stream
  2. 修改配置文件

    $ cd nodeStream && nano ./server/config/default.js

    几个重要配置说明:

    • server.secret 为服务器密钥,用于加密会话,建议修改。

    • server.port 为网页客户端的端口。

    • rtmp_server.trans.ffmepgffmpeg 安装路径。Linux系统下,可以通过 which ffmpeg 获得,默认情况应该是与原始配置相同的,无需更改。Windows系统,则需要手动修改为 ffmepg 实际安装位置。

  3. 安装依赖,运行node-stream

    $ npm install
    $ npm run start

    {% codeblock node-stream/ %} $ npm install $ npm run start {% endcodeblock %}

  4. 访问网页端注册账户并获取串流密钥

    访问http:127.0.0.1:3333 注册帐号:

    注册完成后,进入 Go Live 页面,点击 Generate a new key 生成串流密钥。复制生成的串流密钥。

  5. 利用 OBS 直播串流

    打开OBS > 设置 > 推流。服务器选项选择 自定义 ,服务器输入 rtmp://127.0.0.1:1935/live串流密钥为上一步骤生成的密钥。

  6. 接下就能在客户端首页看到直播列表,点击即可查看。

部署到树莓派上

要将 node-stream 部署到树莓派上,只要在树莓派上安装arm版本的nodejs,再同样按照上面的步骤就可以啦。但是,由于原版的 node-stream 只支持在localhost访问,所以局域网内的其他设备访问就会出现问题。所以笔者fork后针对原版进行了修改,修改的版本:emuqi/node-stream,只要直接在配置文件里将ip_addr配置为树莓派在局域网的ip再运行直播服务就可以在局域网内访问node-stream了。其他更加详细的修改可以看下文。

针对node-stream进行改进

在使用原版的 node-stream 的过程在,发现其存在一些问题。

  1. 不支持自定义ip,只能在localhost运行。
  2. 虽然 node-stream/server/config/default.js 也就是配置文件中提供了很多参数,但是修改部分配置后会出现很多问题。比如修改直播服务的端口后,直播列表的预览图就会加载失败等。

因此,笔者在原版的基础上做了一些改动和修复,感兴趣的朋友可以使用笔者修改过后的版本emuqi/node-stream。使用方法与原版基本相同,主要修改如下:

  • 添加直播服务自定义ip功能

    可在配置中直接修改ip_addr,即可自定义ip。

  const config = {
      server: {
          ip_addr: '127.0.0.1',
          secret: 'kjVkuti2xAyF3JGCzSZTk0YWM5JhI9mgQW4rytXc',
          port : 3333
      },
      ...
  }
  • 修复更改直播服务端口会导致直播缩略图无法正常显示的Bug

  • 更新项目readme