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


Posted in NodeJs onNovember 17, 2017

以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,多流推送需使用其他方案解决。

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

NodeJs 相关文章推荐
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 #NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 #NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 #NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 #NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 #NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 #NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 #NodeJs
You might like
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
laravel自定义分页效果
2017/07/23 PHP
php实现数字补零的方法总结
2018/09/12 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
img的onload的另类用法
2008/01/10 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
python使用marshal模块序列化实例
2014/09/25 Python
Python pickle模块用法实例
2015/04/14 Python
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
上学迟到的检讨书
2014/01/11 职场文书
四下基层实施方案
2014/03/28 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书