github.com: https://github.com/whiskyma/node-media-server
參考文獻:
1、 https://www.huiyani.com/archives/4703/
2、https://blog.csdn.net/CSDNzhaojiale/article/details/118571451
一、熟悉我們先了解一下直播的具體流程
通過上圖我們可以大致的看到。直播一共分爲三個步驟
視頻/圖像採集
流媒體服務器(做推流和拉流的中轉服務器)
拉流/播放
二、具體操作
流媒體服務器搭建
這裏我們用的是nodejs+node-media-server來做我們的視頻中間件。
你只需要建立一個文件夾,然後在這個文件夾做如下操作:
一、npm i node-media-server下載流媒體服務器包
二、創建一個app.js文件並輸入以下內容
三、最後node app.js
服務成功啓動之後,也可以在127.0.0.1:8000/admin訪問流媒體服務的後臺系統。
/** * node .bin/www 啓動更改爲熱啓動:nodemon ./bin/www 啓動命令:npm start **/ const createError = require('http-errors'), express = require('express'), path = require('path'), cookieParser = require('cookie-parser'), logger = require('morgan'), app = express(); NodeMediaServer = require('node-media-server'); const config = { // 接受推過來的流 rtmp: { port: 1935, chunk_size: 60000, gop_cache: true, ping: 30, ping_timeout: 60 }, // 轉發推流的信息 http: { port: 8000, allow_origin: '*' } } var nms = new NodeMediaServer(config); nms.run(); // 推流工具、通常我們常用ffmpeg這個工具來推流、推給我們的中間件1935端口 // 新建一個命令行選擇並輸入以下命令開始推送資源(其中的ip就是你電腦自己的ip) // 推送視頻:xm0525$ ffmpeg -re -i 視頻名稱 -c copy -f flv rtmp://ip:1935/live/STREAM_NAME // 推送攝像頭:ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i 0:0 -vcodec libx264 -preset veryfast -f flv rtmp://ip:1935/live/STREAM_NAME // 推送屏幕:ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://ip:1935/live/STREAM_NAME app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', require('./routes/index')); app.use('/users', require('./routes/users')); app.use(function(req, res, next) { next(createError(404)); }); app.use(function(err, req, res, next) { res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; res.status(err.status || 500); res.render('error'); }); process.env.PORT = 3000; //默認3000端口,可自行更改端口號 module.exports = app;
推流
一、傳輸的流媒體傳輸協議
常用的流媒體傳輸協議有RTMP, RTSP,HLS和HTTP-FLV。
RTMP (可用於推流端和拉流端)
Real Time Messaging Protocol,實時消息傳輸協議。RTMP協議中,視頻必須是H264編碼,音頻必須是AAC或MP3編碼,且多以flv格式封包。因爲RTMP協議傳輸的基本是FLV格式的流文件,必須使用flash播放器才能播放。
RTSP (用於推流端)
Real-Time Stream Protocol,RTSP實時效果非常好,適合視頻聊天、視頻監控等方向。
HLS (用於拉流端)
Http Live Streaming,由Apple公司定義的基於HTTP的流媒體實時傳輸協議。傳輸內容包括兩部分:1.M3U8描述文件;2.TS媒體文件。TS媒體文件中的視頻必須是H264編碼,音頻必須是AAC或MP3編碼。數據通過HTTP協議傳輸。目前video.js庫支持該格式文件的播放。
HTTP-FLV (用於拉流端)
本協議就是http+flv,將音視頻數據封裝成FLV格式,然後通過http協議傳輸到客戶端,這個協議大大方便了瀏覽器客戶端播放直播視頻流。目前flv.js庫支持該格式的文件播放。
二、推流工具
推流我們通過ffmpeg這個工具來進行推流,推給我們的中間件1935端口
下載:brew install ffmpeg
ffmpeg,它是一個用來記錄、轉換數字音視頻,並將其轉化爲流的開源軟件,通過它可以進行視頻的採集封裝成流,並推送到流媒體服務器,例如在mac上面安裝了這個軟件之後,可以通過它調用攝像頭,並將攝像頭數據封裝成流後推送到流媒體服務器,這個過程就是推流。ffmpeg還可以推送本地的視頻文件到流媒體服務器。
三、具體操作
新建一個命令行選擇並輸入以下命令開始推送資源(其中的ip就是你電腦自己的ip)
推送視頻:xm0525$ ffmpeg -re -i 視頻名稱 -c copy -f flv rtmp://ip:1935/live/STREAM_NAME
推送攝像頭:ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i 0:0 -vcodec libx264 -preset veryfast -f flv rtmp://ip:1935/live/STREAM_NAME
推送屏幕:ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://ip:1935/live/STREAM_NAME
拉流
新建一個index.html頁面來接受推送過來的數據
我們通過flv.js來接受推過來的流量,注意裏寫的是轉發過來的端口號8000端口
前端起一個http-server並訪問自己的ip進入index.html頁面
<!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title></title> </head> <body> <script src="https://cdn.bootcss.com/flv.js/1.4.0/flv.min.js"></script> <video id="videoElement" style="width: 80%" controls="controls"></video> <script> if (flvjs.isSupported()) { var videoElement = document.getElementById('videoElement') var flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://ip:8000/live/STREAM_NAME.flv' }) flvPlayer.attachMediaElement(videoElement) flvPlayer.load() flvPlayer.play() } </script> </body> </html>
總結
推流:ffmpeg
流媒體服務器:nodejs
+node-media-server
拉流:flv.js+video
github.com: https://github.com/whiskyma/node-media-server
點個贊吧!!!謝謝