91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解NODEJS基于FFMPEG視頻推流測試

發布時間:2020-09-17 18:24:08 來源:腳本之家 閱讀:342 作者:不會爬樹的猴 欄目:web開發

以ffmpeg為核心,包裝一款局域網內接收轉碼并推送互聯網的客戶端軟件。本文僅使用ffmpeg基礎功能,拉流、轉碼、推流及簡單播放設置。

工作流程

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

所需工具及軟件

1、ffmpeg 命令行工具官網鏈接,選擇它的優勢在于:

  1. 免費
  2. 無需安裝,很大的減少用戶操作復雜度
  3. 命令行啟動調用

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播放軟件。用于監測推流、轉碼、播放是否正常。官網鏈接

實現代碼

  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打包進軟件中
        //需設置各應用程序的對應路徑
        //若僅在本機使用,可以跳過該步驟
        //設置環境變量,添加 PATH 即可
        .setFfmpegPath(ffmpegPath)
        .setFfprobePath(ffprobePath)
        .setFlvtoolPath(flvtoolPath)
        //為保證靈活性,非必須參數采用配置文件讀取模式
        .size(command.size);
        for(let key in command.args){
          ffCommand.outputOption(command.args[key]);
        }
        ffCommand.on("start",(commandLine)=>{
          //commandLine 為實際上調用的命令行命令,拼接邏輯為
          //您的ffmpeg所在路徑 -i inputOptions 您的拉流協議和路徑 outputOptions 推送流協議和地址
          //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);
    })
  }

小結

通過監聽"start"獲取的命令,亦可以通過 exec(yourCommandLine) 進行調用操作,但此時無法控制 ffmpeg 的運行結果。該程序結束運行之后,ffmpeg進程依然在運行,直至流報錯或手動停止進程。暫時不清楚為何 fluent-ffmpeg 可以做到在本體進程結束后,通知關閉第三方進程。猜測是通過命令行輸入切斷進程,若僅通過 ChildProcess.kill() 是無法關閉第三方進程。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长兴县| 青铜峡市| 车致| 鄄城县| 双流县| 重庆市| 沁源县| 肥乡县| 凤山县| 宁阳县| 托里县| 红安县| 临泽县| 东至县| 紫金县| 泗洪县| 大姚县| 探索| 恩施市| 延川县| 卢湾区| 天峨县| 竹北市| 满洲里市| 涟水县| 明溪县| 仙游县| 突泉县| 南和县| 宁强县| 汝城县| 乌拉特后旗| 彭水| 云梦县| 潞城市| 泸定县| 修水县| 紫阳县| 松原市| 夹江县| 清苑县|