以ffmpeg为核心,包装一款局域网内接收转码并推送互联网的客户端软件。本文仅使用ffmpeg基础功能,拉流,转码,推流及简单播放设置。
<>强工作流程强>
-
<李>拉取远端视频流,视频流格式为rtsp李>
<李>转换为常用播放格式rtmp李>
<李>推送至播放端口rtmp://您的推送端地址,用户使用播放软件连接该地址后可以直接进行内容播放李>
<强>所需工具及软件强>
1, ffmpeg命令行工具官网链接,选择它的优势在于:
-
<李>免费李>
<李>无需安装,很大的减少用户操作复杂度李>
<李>命令行启动调用李>
2, nodejs版本号为v6.11.3。(实际项目中使用电子,但若没有打包成客户端的需求,nodejs即可正常运行)
3, tsc版本号为v2.6.1。项目使用打印稿为主要编写语言,您使用JavaScript也没有问题。
若使用tsc,请使用2.0以上版本,自带的@type工具会极大提升编码效率
4, fluent-ffmpeg版本号为v2.1.2。该nodejs包封装了ffmpeg的命令行调用部分,加强了代码的可读性,若熟悉ffmpeg命令行使用手册,亦可不使用该包。
npm安装,节省fluent-ffmpeg//使用js编码的用户,可以忽略下条命令 npm安装——拯救@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”; 导出功能startPushVideo():空白{ getCommands(),然后((命令:ffmpegPaths[])=祝辞{ (让关键的命令){ 让命令=命令(例子);//设置输入流地址 让ffCommand=ffmpeg (command.inputPath)//设置输出流地址 .output (command.outputPath)//因需要打包客户端软件,故而将ffmpeg打包进软件中//需设置各应用程序的对应路径//若仅在本机使用,可以跳过该步骤//设置环境变量,添加路径即可 .setFfmpegPath (ffmpegPath) .setFfprobePath (ffprobePath) .setFlvtoolPath (flvtoolPath)//为保证灵活性,非必须参数采用配置文件读取模式 .size (command.size); (让关键command.args) { ffCommand.outputOption (command.args(例子)); } ffCommand.on(“开始”(命令行)=祝辞{//命令行为实际上调用的命令行命令,拼接逻辑为//您的ffmpeg所在路径- inputOptions您的拉流协议和路径outputOptions推送流协议和地址//ffmpeg我“rtsp://yourPullUrl”- f flv 25 - s - r 640 x480——“rtmp://yourPushUrl” 控制台。日志(' (' + showTime() + ']视频推!”); 控制台。日志(' (' + showTime() + ']了Ffmpeg命令!”); 控制台。日志(' (' + showTime() + ']命令:”+命令行); }) 内(“错误”,函数(呃,stdout, stderr) { 控制台。日志(“错误:”+ err.message); 控制台。日志(stdout: ' + stdout); 控制台。日志(stderr: ' + stderr); }) 内(“结束”,函数(){ 控制台。日志(' (' + showTime() + ']视频推完成! '); }) .run (); } },(错误)=祝辞{ 控制台。日志(“错误:”+错误); }) } >之前<强>小结强>
通过监听“开始”获取的命令,亦可以通过exec (yourCommandLine)进行调用操作,但此时无法控制ffmpeg的运行结果。该程序结束运行之后,ffmpeg进程依然在运行,直至流报错或手动停止进程。暂时不清楚为何fluent-ffmpeg可以做到在本体进程结束后,通知关闭第三方进程。猜测是通过命令行输入切断进程,若仅通过ChildProcess.kill()是无法关闭第三方进程。
在I5 8 g机器上运行,单流推送已占用35%左右cpu、多流推送需使用其他方案解决。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
详解NODEJS基于FFMPEG视频推流测试