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

记录一下使用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的管理端界面。截图如下:

使用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搭建流媒体服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用nodeJS搭建本地文件服务器的几种方法小结

    搭建nodejs服务器步骤: 1.安装nodejs服务,node相当于apache服务器 2.在自己定义的目录下新建服务器文件如 server.js 例如,我在E:\PhpProject\HTML5\websocket下创建了server.js文件 var http = require('http');//引入http模块 //开启服务,监听8888端口 //端口号最好为6000以上 var server = http.createServer(function(req,res){ /* req

  • nodejs搭建本地服务器轻松解决跨域问题

    最近把以前用jquery写的一个小demo拿出来运行的,刚开始的时候忘了开启本地服务导致控制台一直报XMLHttpRequest cannot load file:///C:/Users/79883/Desktop/ajax/data.json?{%22username%22:%22lcl@qq.com%22,%22pwd%22:%22Home20170702%22}. Cross origin requests are only supported for protocol schemes:

  • NodeJs搭建本地服务器之使用手机访问的实例讲解

    作为一名不懂后台的前端工程师来说,利用node.js搭建服务器,是一个非常好的选择.下面搭建一个简单的服务器: var app=require("express")(); //接收来自用户的任何请求 app.use(function(req,res){ res.write("The response from server"); res.end(); }); 这个ip地址,楼主之前一直以为是在这里指定IP地址,意味着别人输入这个IP地址就能访问到你的服务器了,其实并

  • 详解node.js搭建代理服务器请求数据

    1.引入node.js中的模块 var http = require("http"); var url = require("url"); var qs = require("querystring"); 2.创建服务器 //用node中的http创建服务器 并传入两个形参 http.createServer(function(req , res) { //设置请求头 允许所有域名访问 解决跨域 res.setHeader("Acces

  • 在windows上用nodejs搭建静态文件服务器的简单方法

    在windows上用nodejs搭建一个静态文件服务器,即使你一点基础没有也能学会nodejs静态文件服务器的搭建,本文介绍的非常详细,很适合零基础入门的朋友学习. 首先安装nodejs: •新建一个node文件夹 •下载node.exe到该文件夹 •下载npm然后解压到该文件夹 •现在node文件夹是这样的 •把该目录加入到path环境变量 •在命令行执行 node -v npm -v 如果得到了版本号则表示nodejs安装完成 •在命令行中执行 npm config set registry

  • Nodejs 搭建简单的Web服务器详解及实例

    使用 Nodejs 搭建简单的Web服务器 使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容

  • 利用node.js搭建简单web服务器的方法教程

    前言 使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 早先不使用web服务器的情况下想要在浏览器端访问本地资源,可以利用firefox浏览器,其可以自己启动一个小型web服务器. 为了让刚接触node的人也能大体看懂,本文的代码我将尽量简化. 准备 首先,

  • Nodejs如何搭建Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

  • nodejs搭建本地服务器并访问文件的方法

    安装node:https://nodejs.org/en/download/ 在本地建立目录:f:/nodetest,在该目录下新建index.html作为我们将要访问的内容.新建server.js作为node开启的入口: $ cd f:/nodetest $ mkdir index.html $ mkdir server.js index.html文件里简单写一点东西: <!DOCTYPE html> <html lang="en"> <head>

  • node通过express搭建自己的服务器

    前言 为了模拟项目上线,我们就需要一个服务器去提供API给我们调用数据.这次我采用express框架去写API接口.所有请求都是通过ajax请求去请求服务器来返回数据.第一次用node写后端,基本就是摸着石头的过河,文中有什么不足不处欢迎指出. 安装express框架 传送门: express官方 然后介绍一下需要引入的中间件,node本身提供了一些库.我们可以直接通过require去引用,对于未提供的库,我们也可以通过手动npm去安装 var fs = require('fs'); 操作文件模

随机推荐