NestJS搭建直播服务器

NestJS搭建直播服务器 🐱‍🏍🐱‍🏍🐱‍🏍

介绍

后端使用node-media-server搭建直播推流服务器,使用obs推流,前端可使用B站开源的flv.js来播放直播,React可使用react-player播放

一、实现原理

二、node-media-server 搭建直播流服务器

node-media-server是基于node.Js开发的一个推流服务器GitHub地址 ☞ node-media-server

  • 下载node-media-server@ffmpeg-installer/ffmpeg(对流进行处理需要用到这个工具)推荐使用pnpm

    bash 复制代码
    pnpm i node-media-server @ffmpeg-installer/ffmpeg
  • 新建一个live.js文件

    js 复制代码
    import NodeMediaServer from 'node-media-server'
    const createStream = () => {
       // 流最基础的配置文件
       const config = {
          rtmp: {
            port: 1935, // 推流端口
            chunk_size: 60000,
            gop_cache: true,
            ping: 30,
            ping_timeout: 60,
          },
          http: {
            port: 8887, // 获取流的地址
            allow_origin: '*',
          }
        }
        const avv = new NodeMediaServer(config)
        avv.run()
    }
    
    createStream()
  • 执行该文件 node live.js 控制台会打印如下则证明服务器启动成功

    bash 复制代码
    Node Media Server v2.6.2
    Node Media Rtmp Server started on port: 1935
    Node Media Http Server started on port: 8887
    Node Media WebSocket Server started on port: 8887
  • 在浏览器中访问127.0.0.1:8887/admin 可访问服务器管理端地址这里可查看更多api

三、使用obs软件进行直播推流obs软件进行直播推流

  • 下载obs 这里以windows版作为演示

  • 下载完成后依此点击 设置 => 直播 设置推流地址为 rtmp://127.0.0.1:1935/live live为app名称可自行替换,推流码也可自行替换

  • 上面我们设置了app名称为live,推流码为mylive2,然后开启直播并打开127.0.0.1:8887/admin 管理端地址(记得刷新页面~),可以看到直播参数,可以点击mylive2来预览直播

四、使用flv.js播放

  • 注意地址由app名称live加namemylive2组成
html 复制代码
<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
<video id="videoElement"></video>
<script>
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: 'http://localhost:8887/live/mylive2.flv'   
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
</script>

五、对视频流进行处理(高级操作)

  • 浏览器访问http://localhost:8887/live/mylive2.flv后可以直接获取流这样并不安全,通常我们会对url进行加密 node-media-server该插件提供了方法,这里只介绍使用m3u8流来播放
  • 修改上面的createStream方法,使用ffmpeg来处理流,上面我们已经下载了
  • 完整配置如下
js 复制代码
const createStream = () => {
   // eslint-disable-next-line @typescript-eslint/no-var-requires   解决ts,eslint报错
   const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path  // 获取ffmpeg工具地址
   // 流最基础的配置文件
   const config = {
      rtmp: {
        port: 1935, // 推流端口
        chunk_size: 60000,
        gop_cache: true,
        ping: 30,
        ping_timeout: 60,
      },
      http: {
        port: 8887, // 获取流的地址
        mediaroot: './media', // 经过处理的流都会放在这个目录下
        allow_origin: '*',
      },
      // 添加任务 输出两个不同分辨率的流
      fission: {
        ffmpeg: ffmpegPath,  // ffmpeg工具的地址,插件会调用ffmpeg来处理流
        tasks: [
          {
            rule: 'live/*',
            model: [
              {
                ab: '192k', // 音频码率
                vb: '10000k', // 视频码率
                vs: '1920x1080', // 决定了视频的分辨率
                vf: '60', // 刷新率60fps
              },
              {
                ab: '320k',
                vb: '20000k',
                vs: '2560x1440', // 决定了视频的分辨率 
                vf: '60',
              },
            ],
          },
        ],
      },
      //  输m3u8格式的视频  及将视频转为hls
      trans: {
        ffmpeg: ffmpegPath,
        tasks: [
          {
            app: 'live',
            hls: true,
            hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
            hlsKeep: true, // to prevent hls file delete after end the stream
            dash: true,
            dashFlags: '[f=dash:window_size=3:extra_window_size=5]',
            dashKeep: true // to prevent dash file delete after end the stream
          }
        ]
      }
    }
    const avv = new NodeMediaServer(config)
    avv.run()
}
  • 配置hlsffmpeg 会将处理的流放到media文件夹中,视频保存为以.ts为后缀的文件中其中index.m3u8决定了视频的播放顺序所以要通过http://localhost:8887/live/mylive2/index.m3u8来获取视频

六、流加密

  • node-media-server该插件确实提供了url加密但通过实践加密功能并不完善支持的范围也有限可在Issues中查看详情
  • 出于安全来讲如果应用到项目中还是建议采取其他方案来实现流加密

最后

相关推荐
子兮曰11 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰11 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万11 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝11 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋12 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁12 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王952714 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大14 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师15 小时前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学15 小时前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端