真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

詳解NODEJS基于FFMPEG視頻推流測(cè)試

以ffmpeg為核心,包裝一款局域網(wǎng)內(nèi)接收轉(zhuǎn)碼并推送互聯(lián)網(wǎng)的客戶端軟件。本文僅使用ffmpeg基礎(chǔ)功能,拉流、轉(zhuǎn)碼、推流及簡(jiǎn)單播放設(shè)置。

成都創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、上高網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為上高等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

工作流程

  1. 拉取遠(yuǎn)端視頻流,視頻流格式為 rtsp
  2. 轉(zhuǎn)換為常用播放格式 rtmp
  3. 推送至播放端口 rtmp://您的推送端地址,用戶使用播放軟件連接該地址后可以直接進(jìn)行內(nèi)容播放

所需工具及軟件

1、ffmpeg 命令行工具官網(wǎng)鏈接,選擇它的優(yōu)勢(shì)在于:

  1. 免費(fèi)
  2. 無(wú)需安裝,很大的減少用戶操作復(fù)雜度
  3. 命令行啟動(dòng)調(diào)用

2、nodejs 版本號(hào)為 v6.11.3。(實(shí)際項(xiàng)目中使用electron,但若沒(méi)有打包成客戶端的需求,nodejs即可正常運(yùn)行)

3、tsc 版本號(hào)為 v2.6.1。項(xiàng)目使用TypeScript為主要編寫(xiě)語(yǔ)言,您使用JavaScript也沒(méi)有問(wèn)題。

若使用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ī)使用,可以跳過(guò)該步驟
        //設(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é)

通過(guò)監(jiān)聽(tīng)"start"獲取的命令,亦可以通過(guò) exec(yourCommandLine) 進(jìn)行調(diào)用操作,但此時(shí)無(wú)法控制 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è)是通過(guò)命令行輸入切斷進(jìn)程,若僅通過(guò) ChildProcess.kill() 是無(wú)法關(guān)閉第三方進(jìn)程。

在I5 8G 機(jī)器上運(yùn)行,單流推送已占用35%左右cpu,多流推送需使用其他方案解決。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)頁(yè)名稱(chēng):詳解NODEJS基于FFMPEG視頻推流測(cè)試
本文URL:http://weahome.cn/article/popegc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部