記錄一下使用node-media-server的一些過程。本文章環境為windows。本文章適合初學者。
使用到的東西:nodeJs
、ffmpeg
、node-media-server
。
這里說一點(如果有錯歡迎指出):
node-media-server是作為流媒體服務器,你可以把他理解為中轉站,用于轉換流格式或者對視頻流做一些操作以及向外推送流地址。
ffmpeg是作為推流工具,將你需要轉換的視頻或者視頻流推流到流媒體服務器中。
拉流的意思是從流媒體服務器上拉去視頻流,觀看者通過拉取流媒體服務器發布的流地址進行觀看。你用視頻播放器播放就是在拉流。
安裝
node-media-server是基于node.Js開發的,所以需要先使用npm安裝。
1
|
npm install node-media-server |
編寫并運行node-media-server
新建app.js。并編寫下述代碼,然后運行app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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啟動起來。
1
|
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內部有設置默認值,但是還是推薦在設置一次。然后使用下述配置即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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(內網,由于沒有外網地址,所以外網不是很清楚)。延遲較小。
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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搭建流媒體服務器內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/QiZi_Zpl/article/details/107259935