詳解NODEJS基于FFMPEG視頻推流測試
以ffmpeg為核心,包裝一款局域網(wǎng)內接收轉碼并推送互聯(lián)網(wǎng)的客戶端軟件。本文僅使用ffmpeg基礎功能,拉流、轉碼、推流及簡單播放設置。
工作流程
- 拉取遠端視頻流,視頻流格式為 rtsp
- 轉換為常用播放格式 rtmp
- 推送至播放端口 rtmp://您的推送端地址,用戶使用播放軟件連接該地址后可以直接進行內容播放
所需工具及軟件
1、ffmpeg 命令行工具官網(wǎng)鏈接,選擇它的優(yōu)勢在于:
- 免費
- 無需安裝,很大的減少用戶操作復雜度
- 命令行啟動調用
2、nodejs 版本號為 v6.11.3。(實際項目中使用electron,但若沒有打包成客戶端的需求,nodejs即可正常運行)
3、tsc 版本號為 v2.6.1。項目使用TypeScript為主要編寫語言,您使用JavaScript也沒有問題。
若使用tsc,請使用2.0以上版本,自帶的@type工具會極大提升編碼效率
4、fluent-ffmpeg 版本號為 v2.1.2。該nodejs包封裝了ffmpeg的命令行調用部分,加強了代碼的可讀性,若熟悉ffmpeg 命令行使用手冊,亦可不使用該包。
npm install --save fluent-ffmpeg //使用js編碼的用戶,可以忽略下條命令 npm install --save @types/fluent-ffmpeg
VLC播放軟件。用于監(jiān)測推流、轉碼、播放是否正常。官網(wǎng)鏈接
實現(xiàn)代碼
const ffmpegPath = "./dist/ffmpegProgram/bin/ffmpeg.exe";
const ffprobePath = "./dist/ffmpegProgram/bin/ffprobe.exe";
const flvtoolPath = "./dist/ffmpegProgram/bin/ffplay.exe";
export function startPushVideo():void{
getCommands().then((commands:ffmpegPaths[])=>{
for(let key in commands){
let command = commands[key];
//設置輸入流地址
let ffCommand = ffmpeg(command.inputPath)
//設置輸出流地址
.output(command.outputPath)
//因需要打包客戶端軟件,故而將ffmpeg打包進軟件中
//需設置各應用程序的對應路徑
//若僅在本機使用,可以跳過該步驟
//設置環(huán)境變量,添加 PATH 即可
.setFfmpegPath(ffmpegPath)
.setFfprobePath(ffprobePath)
.setFlvtoolPath(flvtoolPath)
//為保證靈活性,非必須參數(shù)采用配置文件讀取模式
.size(command.size);
for(let key in command.args){
ffCommand.outputOption(command.args[key]);
}
ffCommand.on("start",(commandLine)=>{
//commandLine 為實際上調用的命令行命令,拼接邏輯為
//您的ffmpeg所在路徑 -i inputOptions 您的拉流協(xié)議和路徑 outputOptions 推送流協(xié)議和地址
//ffmpeg -i "rtsp://yourPullUrl" -f flv -r 25 -s 640x480 -an "rtmp://yourPushUrl"
console.log('[' + showTime() + '] Vedio is Pushing !');
console.log('[' + showTime() + '] Spawned Ffmpeg with command !');
console.log('[' + showTime() + '] Command: ' + commandLine);
})
.on('error', function(err, stdout, stderr) {
console.log('error: ' + err.message);
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
})
.on('end', function() {
console.log('[' + showTime() + '] Vedio Pushing is Finished !');
})
.run();
}
},(error)=>{
console.log('error: ' + error);
})
}
小結
通過監(jiān)聽"start"獲取的命令,亦可以通過 exec(yourCommandLine) 進行調用操作,但此時無法控制 ffmpeg 的運行結果。該程序結束運行之后,ffmpeg進程依然在運行,直至流報錯或手動停止進程。暫時不清楚為何 fluent-ffmpeg 可以做到在本體進程結束后,通知關閉第三方進程。猜測是通過命令行輸入切斷進程,若僅通過 ChildProcess.kill() 是無法關閉第三方進程。
在I5 8G 機器上運行,單流推送已占用35%左右cpu,多流推送需使用其他方案解決。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Node.JS用純JavaScript生成圖片或滑塊式驗證碼功能
有一些Node.JS圖片生成類庫,比如node-captcha等的類庫,需要c/c++程序生成圖片??缙脚_部署不是很方便。這里介紹幾個用純JS實現(xiàn)的圖片驗證碼生成模塊,需要的朋友可以參考下2019-09-09
Node.js開發(fā)之訪問Redis數(shù)據(jù)庫教程
這篇文章主要介紹了Node.js開發(fā)之訪問Redis數(shù)據(jù)庫教程,本文講解了安裝Redis的Node.js驅動、編寫測試程序以及npm遠程服務器連接十分緩慢的解決方法,需要的朋友可以參考下2015-01-01
開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解
這篇文章主要為大家介紹了開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Express + Session 實現(xiàn)登錄驗證功能
本文主要介紹在 Express 框架中,如何使用 Session 來實現(xiàn)用戶登錄身份驗證。對express session實現(xiàn)登錄驗證相關知識,感興趣的朋友一起看看吧2017-09-09
用C/C++來實現(xiàn) Node.js 的模塊(一)
這篇文章的主要內容其實簡而言之就是——用C/C++來實現(xiàn) Node.js 的模塊,非常的不錯,有需要的朋友可以參考下2014-09-09

