使用node-media-server搭建一个简易的流媒体服务器


Posted in Javascript onJanuary 20, 2021

记录一下使用node-media-server的一些过程。本文章环境为windows。本文章适合初学者。

使用到的东西:nodeJsffmpegnode-media-server

这里说一点(如果有错欢迎指出):

node-media-server是作为流媒体服务器,你可以把他理解为中转站,用于转换流格式或者对视频流做一些操作以及向外推送流地址。

ffmpeg是作为推流工具,将你需要转换的视频或者视频流推流到流媒体服务器中。

拉流的意思是从流媒体服务器上拉去视频流,观看者通过拉取流媒体服务器发布的流地址进行观看。你用视频播放器播放就是在拉流。

安装

node-media-server是基于node.Js开发的,所以需要先使用npm安装。

npm install node-media-server

编写并运行node-media-server

新建app.js。并编写下述代码,然后运行app.js

const NodeMediaServer= require('node-media-server');
const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 60,
    ping_timeout: 30
  },
  http: {
    port: 8000,
    allow_origin: '*',
  }
};
 
var nms = new NodeMediaServer(config)
nms.run();

可以访问localhost:8000/admin地址,访问node-media-server的管理端界面。截图如下:

使用node-media-server搭建一个简易的流媒体服务器

使用FFmpeg命令推送地址。

推送视频文件

在执行下面的代码的时候,需要将node-media-server启动起来。

ffmpeg -re -i ./video.mp4 -c copy -f flv rtmp://localhost:1935/live/STREAM_NAME

上述的命令经过node-media-server后会产生两种流地址。一种rtmp。一种flv。前者可以在电脑上播放,后者可以在手机和电脑上播放。rtmp地址为FFmpeg里的命令地址

flv地址为: http://localhost:8000/live/STREAM_NAME.flv

推送rtsp流

推送rtsp(摄像头视频流)只要将上述的./video.mp4该一下就行。博主在测试过程中发现,推送rtsp流要么会出现绿屏要么会出现丢包现象,特别是和hls结合在一起,丢包率更大,所以不建议使用命令去推送rtsp流。

转hls流格式

转hls流需要注意一点,需要指明一下mediaroot参数,虽然node-media-server内部有设置默认值,但是还是推荐在设置一次。然后使用下述配置即可。

const NodeMediaServer= require('node-media-server');
const ff = require('ffmpeg');
const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 60,
    ping_timeout: 30
  },
  http: {
    port: 8979,
    mediaroot: './media/', // 建议写
    allow_origin: '*',
  },
  trans: { // 这里参数是trans参数,不是relay参数,relay参数中配置hls无效
    ffmpeg: './bin/ffmpeg.exe',//指明FFmpeg位置
    tasks: [
      {
        app: 'live',
        ac: 'acc',
        vc: 'libx264',
        hls: true,
        hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
        dash: true,
        dashFlags: '[f=dash:window_size=3:extra_window_size=5]'
      }
    ]
  }
};
 
var nms = new NodeMediaServer(config)
nms.run();

启动上述代码后,使用FFmpeg进行推流,稍等一会,你就会发现在mediaroot指向的目录下生成一个live/STREAM_NAME的文件夹,里面存放着m3u8文件。由于需要先生成m3u8文件,所以如果是推流摄像头的话,会存在比较大的延迟。

m3u8地址为:http://localhost:8000/live/STREAM_NAME/index.m3u8

如果发现m3u8播放有问题,把ac和vc两个参数去掉试试。楼主在实际使用的时候,这两个参数并没有使用。

使用代码对rtsp流转流

对于有的使用者有可能需要将rtsp摄像头视频流进行推流,以便进行跨端预览,博主这里建议使用这种方法。这种方法无需使用cmd执行FFmpeg命令,而且延迟经博主测试为3s(内网,由于没有外网地址,所以外网不是很清楚)。延迟较小。

代码如下:

const NodeMediaServer= require('node-media-server');
const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 60,
    ping_timeout: 30
  },
  http: {
    port: 8979,
    mediaroot: './media/',
    allow_origin: '*',
  },
  relay: {
    ffmpeg: './bin/ffmpeg.exe',
    tasks: [
      {
        app: 'live',
        mode: 'static',
        edge: 'rtsp://admin:****@192.168.4.167:554/Streaming/Channels/101',//rtsp
        name: 'technology',
        rtsp_transport : 'tcp', //['udp', 'tcp', 'udp_multicast', 'http']
      }
    ]
  },
};
 
var nms = new NodeMediaServer(config)
nms.run();

这种方法可以产生两种视频流,一种rtmp一种flv。

总结

因为博主搭建流媒体服务器主要是为了项目中对摄像头进行转流,但是之前JAVA同事有处理过发现会消耗大量的硬件资源,不过博主使用node-media-server倒是没有发现消耗多大的资源,最终还是需要各位具体测试。而且对于摄像头转流,为了避免不必要的性能消耗,楼主打算仅当观察者发起预览的时候,才让服务端启动流媒体转流功能(使用代码对rtsp流转流),当观察者关闭预览,就立即把流媒体功能关闭。这样能避免性能的不必要消耗。毕竟可以直接通过代码直接操作,这样就比较方便,也能降低服务器的一定压力。

到此这篇关于使用node-media-server搭建一个简易的流媒体服务器的文章就介绍到这了,更多相关node-media-server搭建流媒体服务器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
jquery原理以及学习技巧介绍
Nov 11 Javascript
深入浅析JavaScript中的constructor
Apr 19 Javascript
canvas绘图不清晰的解决方案
Feb 28 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
js实现图片放大展示效果
Aug 30 Javascript
浅谈webpack编译vue项目生成的代码探索
Dec 11 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 Javascript
vue项目打包后路由错误的解决方法
Apr 13 Vue.js
vue实现验证用户名是否可用
Jan 20 #Vue.js
node中短信api实现验证码登录的示例代码
Jan 20 #Javascript
vue实现按钮切换图片
Jan 20 #Vue.js
node脚手架搭建服务器实现token验证的方法
Jan 20 #Javascript
Vue实现图书管理案例
Jan 20 #Vue.js
浅析JavaScript中的事件委托机制跟深浅拷贝
Jan 20 #Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 #Vue.js
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
PHPlet在Windows下的安装
2006/10/09 PHP
用PHP实现小型站点广告管理
2006/10/09 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
小程序使用分包的示例代码
2020/03/23 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
python求前n个阶乘的和实例
2020/04/02 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
财务经理的岗位职责
2013/12/17 职场文书
销售找工作求职信
2013/12/20 职场文书
会计工作心得体会
2014/01/13 职场文书
知识竞赛活动方案
2014/02/18 职场文书
计算机专业求职信
2014/06/02 职场文书
室内趣味活动方案
2014/08/24 职场文书
新课培训心得体会
2014/09/03 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python