nodejs ffmpeg 超级工具 rtsp fmp4 rtmp
1、为何使用nodejs作为测试工具
1 、nodejs作为一个非常棒的工具,启动http协议使用express或者koi这种工具非常方便
2 、性能卓越,单线程启动不用担心有访问加锁问题
3、在使用c,c++,等程序来使用ffmpeg sdk时,常常可以使用nodejs和ffmpeg来验证
2、使用express ffmpeg来启动做视频封面
ffmpeg -i a.mp4 -y -f image2 -frames 1 a.jpg
ffmpeg -i 11.mp4 -vframes 1 xx.jpg
ffmpeg -i a.mp4 -r 0.1 frames_%04.png
convert -background white -flatten ***.pdf ***.png
3、使用express ffmpeg来做fmp4的工具
3.1 fmp4常识
fmp4 :
分段mp4,可以作为直播工具
ffmepg movflags参数:
frag_keyframe: 导致碎片输出,empty_moov:将导致输出100%分段;
ffmpeg c sdk调用方式如下
AVDictionary *opts = NULL;
av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
avformat_write_header(o_fmt_ctx, &opts);
av_dict_free(&opts);
3.2 使用fluent-ffmpeg
fluent-ffmpeg 是一个非常好的nodejs封装ffmpeg工具
npm install --save fluent-ffmpeg
const fs = require('fs');
const ffmpegPath = require('ffmpeg-static').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);//这个可以使用当前目录const express = require('express');
const app = express();app.use(express.static(__dirname + '/public'));app.get('/', function (req, res) {res.send('index.html');
});app.get('/video/:filename', function (req, res) {res.contentType('mp4');// make sure you set the correct path to your video file storagevar pathToMovie = 'public/' + req.params.filename;var proc = ffmpeg(pathToMovie)// use the 'flashvideo' preset (located in /lib/presets/flashvideo.js).outputOptions('-movflags','frag_keyframe+empty_moov').noAudio().videoCodec('copy').format('mp4')// setup event handlers.on('end', function () {console.log('file has been converted succesfully');}).on('error', function (err) {console.log('an error happened: ' + err.message);})// save to stream.pipe(res, { end: true });
});app.listen(4000);
4、canvas 传输到后台使用ffmpeg 转化成rtmp
如何把canvas的内容使用h264 经过 websocket传输到后台,我的博客里面有,仔细找一定能找到
以下这个技巧非常有用
/*** Copyright (c) MST.*/const child_process = require('child_process');
const express = require('express');
const WebSocketServer = require('ws').Server;
const http = require('http');const app = express();
const server = http.createServer(app).listen(3000, () => {console.log('Listening...');
});
//建立一个websocket server
const ws_server = new WebSocketServer({server: server
});app.use((req, res, next) => {console.log('HTTP Request: ' + req.method + ' ' + req.originalUrl);return next();
});app.use(express.static(__dirname + '/www'));ws_server.on('connection', (ws, req) => {rtmpUrl = "rtmp://192.168.0.1/live/1001"console.log('Target RTMP URL:', rtmpUrl);const ffmpeg = child_process.spawn('ffmpeg', ['-f', 'lavfi', '-i', 'anullsrc',// FFmpeg will read input video from STDIN'-i', '-','-shortest','-vcodec', 'copy','-acodec', 'aac',// FLV is the container format used in conjunction with RTMP'-f', 'flv',rtmpUrl ]);// If FFmpeg stops for any reason, close the WebSocket connection.const rtspUrl = "rtsp://127.0.0.1:5554/1001";ffmpeg.on('close', (code, signal) => {console.log('FFmpeg child process closed, code ' + code + ', signal ' + signal);ws.terminate();});ffmpeg.stdin.on('error', (e) => {console.log('FFmpeg STDIN Error', e);});// FFmpeg outputs all of its messages to STDERR. Let's log them to the console.ffmpeg.stderr.on('data', (data) => {console.log('FFmpeg STDERR:', data.toString());});// When data comes in from the WebSocket, write it to FFmpeg's STDIN.ws.on('message', (msg) => {console.log('DATA', msg);ffmpeg.stdin.write(msg);});// If the client disconnects, stop FFmpeg.ws.on('close', (e) => {ffmpeg.kill('SIGINT');});});
换一下,推送到rtsp server
const ffmpeg = child_process.spawn('ffmpeg', ['-f', 'lavfi', '-i', 'anullsrc',// FFmpeg will read input video from STDIN'-i', '-','-shortest','-c:v', 'copy','-c:a', 'aac','-buffer_size', '1024000','-f','rtsp','-fflags', 'nobuffer',rtspUrl// FLV is the container format used in conjunction with RTMP//'-f', 'flv',//rtmpUrl ]);
推摄像头到rtsp
var outputh = 'rtsp://' + 'ip' + ':' + 'port' + '/' + textname;
var ffmpegPath = "./ffmpeg_bin/ffmpeg.exe";
var ffmpeg = require('fluent-ffmpeg');
command = new ffmpeg('video=HD USB Camera').setFfmpegPath(ffmpegPath).inputOptions('-f dshow').size('800x600').on('start', function(commandLine) {console.log("start push......." + commandLine);console.log("start command......." + command);}).on('end', function() {console.log("storp push........")stopPush();}).on('error', function(err, stdout, stderr) {console.log('error:' + err.message);console.log('stdout:' + stdout);console.log('stderr:' + stderr);stopPush();}).addOptions([// '-preset veryfast','-rtsp_transport tcp','-f rtsp']).pipe(outputh, { end: true });`
nodejs ffmpeg 超级工具 rtsp fmp4 rtmp相关推荐
- 【流媒体服务】本地视频推流、转码、拉流、直播综合应用(五):【1】VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播
文章目录 前言 一.前几章节回顾 二.操作步骤 1.准备本地视频 2.VLC:获取RTSP视频流 3.FFMPEG:转码推流服务准备 4.Nginx:网站服务准备 5.FFMPEG推流:rtsp转rt ...
- nginx+ffmpeg+flv实现rtsp转rtmp和flv推流(同时拉流)实现浏览器展示监控
介绍 因本人公司业务需要浏览器展示海康威视监控视频,所以在此记录一下.以防下次使用不记得.此监控视频解决方案有10s左右的延迟,如果公司没有强制要求还是可以使用的.如果介意10s延迟的话可以使用第三方 ...
- NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8
一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...
- java中rtsp转m3u8_NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8
一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...
- Python进行ffmpeg推流和拉流rtsp、rtmp
流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议.传统视频流协议:RTMP和RTSP,其中 RTMP 是基于 TCP 开发 ...
- 【FFmpeg】RTSP、RTMP相关命令及开源项目
一.RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i "rtsp://[用户名]:[密码]@192.168.1.100/h265/ ...
- RTSP 和 RTMP原理 通过ffmpeg实现将本地摄像头推流到RTSP服务器
RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 文章目录 RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 一 ...
- java + nginx + ffmpeg + vue实现摄像头,rtmp、rtsp直播流协议的实时播放
目录 大致流程 环境: CentOS 7 安装 ffmpeg docker安装nginx-rtmp nginx-rtmp配置文件详解 例子 java案例 pom依赖 代码案例 前端案例(vue) ja ...
- ffmpeg推rtsp、rtmp音视频流命令
ffmpeg推rtsp.rtmp音视频流命令 rtmp流 推流 播放 rtsp流 推流 播放 原创文章禁止转载 同步发布http://www.alom.com.cn/ ffmpeg推rtsp.rtmp ...
最新文章
- 亲手制作一个《哈利·波特》人物图谱,原来罗恩和赫敏的姻缘从第一部就已注定?...
- html body div height: 100%;
- 两千年是不是闰年 输出错误_干货!AMOS常见的10种错误及解决办法!
- Linux中的软硬连接
- 并发入库面临重复数据的问题
- postgresql 数据库连接数查询
- Talib技术因子详解(七)
- 微信小程序实现每日签到功能
- 生物信息预测毒力因子
- html页面pc端显示正常,手机端页面整体偏左(兼容性处理)
- mysql ibatis count_[mysql] mysql-myibatis-整理
- JavaScript中if嵌套
- (差分)洛谷P4231 三步必杀
- 小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我
- Android开发总结:个人开发者如何通过广告平台赚钱
- java中的数组长度的计算
- 《Hadoop 权威指南》读书笔记之七 — chapter7
- access sql 取余_国家计算机二级ACCESS函数总结
- 戴尔ChromeBook 13-7310刷Ubutu18.04
- Linux命令行与shell脚本编程之笔记(4)