使用node-media-server搭建一個(gè)簡(jiǎn)易的流媒體服務(wù)器
記錄一下使用node-media-server的一些過(guò)程。本文章環(huán)境為windows。本文章適合初學(xué)者。
使用到的東西:nodeJs、ffmpeg、node-media-server。
這里說(shuō)一點(diǎn)(如果有錯(cuò)歡迎指出):
node-media-server是作為流媒體服務(wù)器,你可以把他理解為中轉(zhuǎn)站,用于轉(zhuǎn)換流格式或者對(duì)視頻流做一些操作以及向外推送流地址。
ffmpeg是作為推流工具,將你需要轉(zhuǎn)換的視頻或者視頻流推流到流媒體服務(wù)器中。
拉流的意思是從流媒體服務(wù)器上拉去視頻流,觀看者通過(guò)拉取流媒體服務(wù)器發(fā)布的流地址進(jìn)行觀看。你用視頻播放器播放就是在拉流。
安裝
node-media-server是基于node.Js開(kāi)發(fā)的,所以需要先使用npm安裝。
npm install node-media-server
編寫(xiě)并運(yùn)行node-media-server
新建app.js。并編寫(xiě)下述代碼,然后運(yùn)行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();
可以訪問(wèn)localhost:8000/admin地址,訪問(wèn)node-media-server的管理端界面。截圖如下:

使用FFmpeg命令推送地址。
推送視頻文件
在執(zhí)行下面的代碼的時(shí)候,需要將node-media-server啟動(dòng)起來(lái)。
ffmpeg -re -i ./video.mp4 -c copy -f flv rtmp://localhost:1935/live/STREAM_NAME
上述的命令經(jīng)過(guò)node-media-server后會(huì)產(chǎn)生兩種流地址。一種rtmp。一種flv。前者可以在電腦上播放,后者可以在手機(jī)和電腦上播放。rtmp地址為FFmpeg里的命令地址
flv地址為: http://localhost:8000/live/STREAM_NAME.flv
推送rtsp流
推送rtsp(攝像頭視頻流)只要將上述的./video.mp4該一下就行。博主在測(cè)試過(guò)程中發(fā)現(xiàn),推送rtsp流要么會(huì)出現(xiàn)綠屏要么會(huì)出現(xiàn)丟包現(xiàn)象,特別是和hls結(jié)合在一起,丟包率更大,所以不建議使用命令去推送rtsp流。
轉(zhuǎn)hls流格式
轉(zhuǎn)hls流需要注意一點(diǎn),需要指明一下mediaroot參數(shù),雖然node-media-server內(nèi)部有設(shè)置默認(rèn)值,但是還是推薦在設(shè)置一次。然后使用下述配置即可。
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/', // 建議寫(xiě)
allow_origin: '*',
},
trans: { // 這里參數(shù)是trans參數(shù),不是relay參數(shù),relay參數(shù)中配置hls無(wú)效
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();
啟動(dòng)上述代碼后,使用FFmpeg進(jìn)行推流,稍等一會(huì),你就會(huì)發(fā)現(xiàn)在mediaroot指向的目錄下生成一個(gè)live/STREAM_NAME的文件夾,里面存放著m3u8文件。由于需要先生成m3u8文件,所以如果是推流攝像頭的話,會(huì)存在比較大的延遲。
m3u8地址為:http://localhost:8000/live/STREAM_NAME/index.m3u8
如果發(fā)現(xiàn)m3u8播放有問(wèn)題,把a(bǔ)c和vc兩個(gè)參數(shù)去掉試試。樓主在實(shí)際使用的時(shí)候,這兩個(gè)參數(shù)并沒(méi)有使用。
使用代碼對(duì)rtsp流轉(zhuǎn)流
對(duì)于有的使用者有可能需要將rtsp攝像頭視頻流進(jìn)行推流,以便進(jìn)行跨端預(yù)覽,博主這里建議使用這種方法。這種方法無(wú)需使用cmd執(zhí)行FFmpeg命令,而且延遲經(jīng)博主測(cè)試為3s(內(nèi)網(wǎng),由于沒(méi)有外網(wǎng)地址,所以外網(wǎng)不是很清楚)。延遲較小。
代碼如下:
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();
這種方法可以產(chǎn)生兩種視頻流,一種rtmp一種flv。
總結(jié)
因?yàn)椴┲鞔罱髅襟w服務(wù)器主要是為了項(xiàng)目中對(duì)攝像頭進(jìn)行轉(zhuǎn)流,但是之前JAVA同事有處理過(guò)發(fā)現(xiàn)會(huì)消耗大量的硬件資源,不過(guò)博主使用node-media-server倒是沒(méi)有發(fā)現(xiàn)消耗多大的資源,最終還是需要各位具體測(cè)試。而且對(duì)于攝像頭轉(zhuǎn)流,為了避免不必要的性能消耗,樓主打算僅當(dāng)觀察者發(fā)起預(yù)覽的時(shí)候,才讓服務(wù)端啟動(dòng)流媒體轉(zhuǎn)流功能(使用代碼對(duì)rtsp流轉(zhuǎn)流),當(dāng)觀察者關(guān)閉預(yù)覽,就立即把流媒體功能關(guān)閉。這樣能避免性能的不必要消耗。畢竟可以直接通過(guò)代碼直接操作,這樣就比較方便,也能降低服務(wù)器的一定壓力。
到此這篇關(guān)于使用node-media-server搭建一個(gè)簡(jiǎn)易的流媒體服務(wù)器的文章就介紹到這了,更多相關(guān)node-media-server搭建流媒體服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Node.js中的HTTP?Server對(duì)象與GET、POST請(qǐng)求
- 使用NODE.JS創(chuàng)建一個(gè)WEBSERVER(服務(wù)器)的步驟
- 詳解node.js創(chuàng)建一個(gè)web服務(wù)器(Server)的詳細(xì)步驟
- node.js的http.createServer過(guò)程深入解析
- 詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
- Node.js連接Sql Server 2008及數(shù)據(jù)層封裝詳解
- 手寫(xiě)簡(jiǎn)版無(wú)三方依賴的Node-Server實(shí)現(xiàn)示例
相關(guān)文章
如何發(fā)布一個(gè)npm包到?Nexus私有倉(cāng)庫(kù)
這篇文章主要介紹了如何發(fā)布一個(gè)npm包到?Nexus私有倉(cāng)庫(kù),通過(guò)實(shí)例代碼介紹了如何添加nexus權(quán)限及配置?npm?私庫(kù)免登錄設(shè)置的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-03-03
簡(jiǎn)單實(shí)現(xiàn)nodejs上傳功能
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)nodejs上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
NodeJS如何優(yōu)雅的實(shí)現(xiàn)Sleep休眠
這篇文章主要介紹了NodeJS如何優(yōu)雅的實(shí)現(xiàn)Sleep休眠問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
Node.js API詳解之 vm模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 vm模塊用法,結(jié)合實(shí)例形式分析了Node.js API中vm模塊基本功能、函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對(duì)比
這篇文章主要給大家介紹了關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對(duì)比,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01
node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能
本文主要介紹了node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
nodejs 中模擬實(shí)現(xiàn) emmiter 自定義事件
這篇文章主要介紹了Nodejs中自定義事件實(shí)例,比較簡(jiǎn)單的一個(gè)例子,需要的朋友可以參考下。2016-02-02

