详解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中Buffer模块详解
Jan 07 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
浅谈Node的内存泄露问题
May 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将时间差转换为字符串提示
2011/09/07 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
AngularJS语法详解
2015/01/23 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
总结Python编程中函数的使用要点
2016/03/20 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
恶意软件的定义
2014/11/12 面试题
质检部岗位职责
2013/11/11 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
大学毕业感言50字
2014/02/07 职场文书
项目经理岗位职责
2015/01/31 职场文书
客户答谢会致辞
2015/07/30 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
MySQL 逻辑备份 into outfile
2022/05/15 MySQL