使用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 相关文章推荐
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 Javascript
jquery插件制作 表单验证实现代码
Aug 17 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
鼠标移动到图片名上,显示图片的简单实例
Jul 14 Javascript
js定时器(执行一次、重复执行)
Mar 07 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
vue观察模式浅析
Sep 25 Javascript
JavaScript模拟实现网易云轮播效果
Apr 04 Javascript
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
php学习之运算符相关概念
2011/06/09 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php经典趣味算法实例代码
2020/01/21 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
js实现日历的简单算法
2017/01/24 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python常用小技巧总结
2015/06/01 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
Python3常见函数range()用法详解
2019/12/30 Python
Python常用类型转换实现代码实例
2020/07/28 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
学校周年庆活动方案
2014/08/22 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
Pandas 数据编码的十种方法
2022/04/20 Python