详解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 相关文章推荐
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
初探nodeJS
Jan 24 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
Python入门篇之函数
2014/10/20 Python
python3序列化与反序列化用法实例
2015/05/26 Python
python处理二进制数据的方法
2015/06/03 Python
Python文件及目录操作实例详解
2015/06/04 Python
python简单分割文件的方法
2015/07/30 Python
python破解zip加密文件的方法
2018/05/31 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
语文教研活动总结
2014/07/02 职场文书
自我管理的活动方案
2014/08/25 职场文书
旅游活动总结
2014/08/27 职场文书
党校毕业心得体会
2014/09/13 职场文书
民政局个人整改措施
2014/09/24 职场文书
服务整改报告
2014/11/06 职场文书
三年级学生期末评语
2014/12/26 职场文书
升学宴答谢词
2015/01/05 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python