详解NODEJS基于FFMPEG视频推流测试

  

以ffmpeg为核心,包装一款局域网内接收转码并推送互联网的客户端软件。本文仅使用ffmpeg基础功能,拉流,转码,推流及简单播放设置。

  

<>强工作流程
  

  
      <李>拉取远端视频流,视频流格式为rtsp李   <李>转换为常用播放格式rtmp李   <李>推送至播放端口rtmp://您的推送端地址,用户使用播放软件连接该地址后可以直接进行内容播放李   
  

<强>所需工具及软件
  

  

1, ffmpeg命令行工具官网链接,选择它的优势在于:

  
      <李>免费   <李>无需安装,很大的减少用户操作复杂度   <李>命令行启动调用李   
  

2, nodejs版本号为v6.11.3。(实际项目中使用电子,但若没有打包成客户端的需求,nodejs即可正常运行)
  

  

3, tsc版本号为v2.6.1。项目使用打印稿为主要编写语言,您使用JavaScript也没有问题。
  

  

若使用tsc,请使用2.0以上版本,自带的@type工具会极大提升编码效率
  

  

4, fluent-ffmpeg版本号为v2.1.2。该nodejs包封装了ffmpeg的命令行调用部分,加强了代码的可读性,若熟悉ffmpeg命令行使用手册,亦可不使用该包。
  

        npm安装,节省fluent-ffmpeg//使用js编码的用户,可以忽略下条命令   npm安装——拯救@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”;      导出功能startPushVideo():空白{   getCommands(),然后((命令:ffmpegPaths[])=祝辞{   (让关键的命令){   让命令=命令(例子);//设置输入流地址   让ffCommand=ffmpeg (command.inputPath)//设置输出流地址   .output (command.outputPath)//因需要打包客户端软件,故而将ffmpeg打包进软件中//需设置各应用程序的对应路径//若仅在本机使用,可以跳过该步骤//设置环境变量,添加路径即可   .setFfmpegPath (ffmpegPath)   .setFfprobePath (ffprobePath)   .setFlvtoolPath (flvtoolPath)//为保证灵活性,非必须参数采用配置文件读取模式   .size (command.size);   (让关键command.args) {   ffCommand.outputOption (command.args(例子));   }   ffCommand.on(“开始”(命令行)=祝辞{//命令行为实际上调用的命令行命令,拼接逻辑为//您的ffmpeg所在路径- inputOptions您的拉流协议和路径outputOptions推送流协议和地址//ffmpeg我“rtsp://yourPullUrl”- f flv 25 - s - r 640 x480——“rtmp://yourPushUrl”   控制台。日志(' (' + showTime() + ']视频推!”);   控制台。日志(' (' + showTime() + ']了Ffmpeg命令!”);   控制台。日志(' (' + showTime() + ']命令:”+命令行);   })   内(“错误”,函数(呃,stdout, stderr) {   控制台。日志(“错误:”+ err.message);   控制台。日志(stdout: ' + stdout);   控制台。日志(stderr: ' + stderr);   })   内(“结束”,函数(){   控制台。日志(' (' + showTime() + ']视频推完成! ');   })   .run ();   }   },(错误)=祝辞{   控制台。日志(“错误:”+错误);   })   }      之前      

<强>小结
  

  

通过监听“开始”获取的命令,亦可以通过exec (yourCommandLine)进行调用操作,但此时无法控制ffmpeg的运行结果。该程序结束运行之后,ffmpeg进程依然在运行,直至流报错或手动停止进程。暂时不清楚为何fluent-ffmpeg可以做到在本体进程结束后,通知关闭第三方进程。猜测是通过命令行输入切断进程,若仅通过ChildProcess.kill()是无法关闭第三方进程。
  

  

在I5 8 g机器上运行,单流推送已占用35%左右cpu、多流推送需使用其他方案解决。
  

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

详解NODEJS基于FFMPEG视频推流测试