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中查看详情
  • 出于安全来讲如果应用到项目中还是建议采取其他方案来实现流加密

最后

相关推荐
GIS程序媛—椰子36 分钟前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_00142 分钟前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端1 小时前
Content Security Policy (CSP)
前端·javascript·面试
木舟10091 小时前
ffmpeg重复回听音频流,时长叠加问题
前端
王大锤43911 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
我血条子呢1 小时前
[Vue]防止路由重复跳转
前端·javascript·vue.js
黎金安1 小时前
前端第二次作业
前端·css·css3
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
半开半落2 小时前
nuxt3安装pinia报错500[vite-node] [ERR_LOAD_URL]问题解决
前端·javascript·vue.js·nuxt