详解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服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 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
第十三节--对象串行化
2006/11/16 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
理解javascript闭包
2015/12/15 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
JS实现li标签的删除
2019/04/12 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
Python中防止sql注入的方法详解
2017/02/25 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
共筑中国梦演讲稿
2014/04/23 职场文书
公司应聘求职信
2014/06/21 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
教代会开幕词
2015/01/28 职场文书
党员证明模板
2015/06/19 职场文书
小学班级口号大全
2015/12/25 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
oracle表分区的概念及操作
2021/04/24 Oracle
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
Python Pandas常用函数方法总结
2021/06/15 Python