首頁 >web前端 >js教程 >nodejs基於ffmpeg進行視訊推流直播

nodejs基於ffmpeg進行視訊推流直播

php中世界最好的语言
php中世界最好的语言原創
2018-04-14 15:39:0813842瀏覽

這次為大家帶來nodejs基於ffmpeg進行視訊推流直播,nodejs基於ffmpeg進行視訊推流直播的注意事項有哪些,下面就是實戰案例,一起來看一下。

以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,多流推送需使用其他方案解決。               ######相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章! ######推薦閱讀:#########Vue2.0設定全域樣式步奏詳解###############用NodeJS讓影片轉碼## #############實作完整的Angular4 FormText元件需要哪些步奏#############

以上是nodejs基於ffmpeg進行視訊推流直播的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn