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. 【流媒体服务】本地视频推流、转码、拉流、直播综合应用(五):【1】VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

    文章目录 前言 一.前几章节回顾 二.操作步骤 1.准备本地视频 2.VLC:获取RTSP视频流 3.FFMPEG:转码推流服务准备 4.Nginx:网站服务准备 5.FFMPEG推流:rtsp转rt ...

  2. nginx+ffmpeg+flv实现rtsp转rtmp和flv推流(同时拉流)实现浏览器展示监控

    介绍 因本人公司业务需要浏览器展示海康威视监控视频,所以在此记录一下.以防下次使用不记得.此监控视频解决方案有10s左右的延迟,如果公司没有强制要求还是可以使用的.如果介意10s延迟的话可以使用第三方 ...

  3. NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8

    一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...

  4. java中rtsp转m3u8_NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8

    一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...

  5. Python进行ffmpeg推流和拉流rtsp、rtmp

    流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议.传统视频流协议:RTMP和RTSP,其中 RTMP 是基于 TCP 开发 ...

  6. 【FFmpeg】RTSP、RTMP相关命令及开源项目

    一.RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i "rtsp://[用户名]:[密码]@192.168.1.100/h265/ ...

  7. RTSP 和 RTMP原理 通过ffmpeg实现将本地摄像头推流到RTSP服务器

    RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 文章目录 RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 一 ...

  8. java + nginx + ffmpeg + vue实现摄像头,rtmp、rtsp直播流协议的实时播放

    目录 大致流程 环境: CentOS 7 安装 ffmpeg docker安装nginx-rtmp nginx-rtmp配置文件详解 例子 java案例 pom依赖 代码案例 前端案例(vue) ja ...

  9. ffmpeg推rtsp、rtmp音视频流命令

    ffmpeg推rtsp.rtmp音视频流命令 rtmp流 推流 播放 rtsp流 推流 播放 原创文章禁止转载 同步发布http://www.alom.com.cn/ ffmpeg推rtsp.rtmp ...

最新文章

  1. 亲手制作一个《哈利·波特》人物图谱,原来罗恩和赫敏的姻缘从第一部就已注定?...
  2. html body div height: 100%;
  3. 两千年是不是闰年 输出错误_干货!AMOS常见的10种错误及解决办法!
  4. Linux中的软硬连接
  5. 并发入库面临重复数据的问题
  6. postgresql 数据库连接数查询
  7. Talib技术因子详解(七)
  8. 微信小程序实现每日签到功能
  9. 生物信息预测毒力因子
  10. html页面pc端显示正常,手机端页面整体偏左(兼容性处理)
  11. mysql ibatis count_[mysql] mysql-myibatis-整理
  12. JavaScript中if嵌套
  13. (差分)洛谷P4231 三步必杀
  14. 小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我
  15. Android开发总结:个人开发者如何通过广告平台赚钱
  16. java中的数组长度的计算
  17. 《Hadoop 权威指南》读书笔记之七 — chapter7
  18. access sql 取余_国家计算机二级ACCESS函数总结
  19. 戴尔ChromeBook 13-7310刷Ubutu18.04
  20. Linux命令行与shell脚本编程之笔记(4)

热门文章

  1. python etree pandas_python爬虫Xpath,pandas示例
  2. 华为公开“一种芯片堆叠封装及终端设备”专利
  3. 空间站是如何绕地飞行的?张朝阳物理课开播啦
  4. 泡泡玛特回应与肯德基联名引发炒作:暂停食品行业的定制盲盒业务
  5. 董明珠上榜中国杰出商界女性100
  6. 雷军恭喜苏炳添全运会夺冠:你是小米精神的最好代言
  7. 2022年推出?特斯拉人形机器人被批就是个笑话
  8. 微信又有大更新!新增多款铃声、腾讯电子签等功能
  9. iPhone 12 Max电池容量曝光:老扎心了
  10. SpaceX载人龙飞船两名宇航员成功进入国际空间站