您好,登錄后才能下訂單哦!
以ffmpeg為核心,包裝一款局域網(wǎng)內(nèi)接收轉(zhuǎn)碼并推送互聯(lián)網(wǎng)的客戶端軟件。本文僅使用ffmpeg基礎(chǔ)功能,拉流、轉(zhuǎn)碼、推流及簡(jiǎn)單播放設(shè)置。
工作流程
所需工具及軟件
1、ffmpeg 命令行工具官網(wǎng)鏈接,選擇它的優(yōu)勢(shì)在于:
2、nodejs 版本號(hào)為 v6.11.3。(實(shí)際項(xiàng)目中使用electron,但若沒有打包成客戶端的需求,nodejs即可正常運(yùn)行)
3、tsc 版本號(hào)為 v2.6.1。項(xiàng)目使用TypeScript為主要編寫語(yǔ)言,您使用JavaScript也沒有問題。
若使用tsc,請(qǐng)使用2.0以上版本,自帶的@type工具會(huì)極大提升編碼效率
4、fluent-ffmpeg 版本號(hào)為 v2.1.2。該nodejs包封裝了ffmpeg的命令行調(diào)用部分,加強(qiáng)了代碼的可讀性,若熟悉ffmpeg 命令行使用手冊(cè),亦可不使用該包。
npm install --save fluent-ffmpeg //使用js編碼的用戶,可以忽略下條命令 npm install --save @types/fluent-ffmpeg
VLC播放軟件。用于監(jiān)測(cè)推流、轉(zhuǎn)碼、播放是否正常。官網(wǎng)鏈接
實(shí)現(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]; //設(shè)置輸入流地址 let ffCommand = ffmpeg(command.inputPath) //設(shè)置輸出流地址 .output(command.outputPath) //因需要打包客戶端軟件,故而將ffmpeg打包進(jìn)軟件中 //需設(shè)置各應(yīng)用程序的對(duì)應(yīng)路徑 //若僅在本機(jī)使用,可以跳過該步驟 //設(shè)置環(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 為實(shí)際上調(diào)用的命令行命令,拼接邏輯為 //您的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é)
通過監(jiān)聽"start"獲取的命令,亦可以通過 exec(yourCommandLine) 進(jìn)行調(diào)用操作,但此時(shí)無法控制 ffmpeg 的運(yùn)行結(jié)果。該程序結(jié)束運(yùn)行之后,ffmpeg進(jìn)程依然在運(yùn)行,直至流報(bào)錯(cuò)或手動(dòng)停止進(jìn)程。暫時(shí)不清楚為何 fluent-ffmpeg 可以做到在本體進(jìn)程結(jié)束后,通知關(guān)閉第三方進(jìn)程。猜測(cè)是通過命令行輸入切斷進(jìn)程,若僅通過 ChildProcess.kill() 是無法關(guān)閉第三方進(jìn)程。
在I5 8G 機(jī)器上運(yùn)行,單流推送已占用35%左右cpu,多流推送需使用其他方案解決。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。