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

最后

相关推荐
码爸12 分钟前
flink doris批量sink
java·前端·flink
深情废杨杨13 分钟前
前端vue-父传子
前端·javascript·vue.js
J不A秃V头A1 小时前
Vue3:编写一个插件(进阶)
前端·vue.js
司篂篂2 小时前
axios二次封装
前端·javascript·vue.js
姚*鸿的博客2 小时前
pinia在vue3中的使用
前端·javascript·vue.js
宇文仲竹2 小时前
edge 插件 iframe 读取
前端·edge
Kika写代码2 小时前
【基于轻量型架构的WEB开发】【章节作业】
前端·oracle·架构
天下无贼!4 小时前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr4 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林4 小时前
npm发布插件超级简单版
前端·npm·node.js