详解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中的非阻塞方法介绍
Jun 05 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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
php5 and xml示例
2006/11/22 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
院药学专业个人求职信
2013/09/21 职场文书
毕业生自荐书
2014/02/03 职场文书
给校长的建议书600字
2014/05/15 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
数学教师求职信范文
2015/03/20 职场文书
在职证明格式样本
2015/06/15 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
pytorch实现手写数字图片识别
2021/05/20 Python
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技