ffmpeg + jsmpeg + node 实现单路 or 多路低延时直播 ( mac )
时间:2021-08-13
本文章向大家介绍 ffmpeg + jsmpeg + node 实现单路 or 多路低延时直播 ( mac ),主要包括 ffmpeg + jsmpeg + node 实现单路 or 多路低延时直播 ( mac )使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前提:视频流格式采用 海康nvr摄像头的rtsp流;
默认格式为 rtsp://账号:密码@ip地址 举个栗子: rtsp://mifan:1234567@172.16.154.198
目标:实现h5中视频低延迟视频播放
环境准备:
- nodejs + http-server(客户端网页容器) 网上安装教程超多,可自行百度
- fmpeg(向jsmpeg服务端推流) mac中安装可参考 https://www.jianshu.com/p/f6990aee6c7f
- jsmpeg(流转成websocket) jsmpeg 点击下载
- 一个rtsp视频流 (也可以是本地视频文件)
安装websocket和http-server
npm install -g ws
npm install ws
npm install http-server -g
1、单路直播 (webscoket-replay.js)
1.1 启动 jsmpeg
打开一个命令行,进入jsmpeg目录,运行:
node websocket-relay.js supersecret 8081 8082
参数说明:
- Supersecret 是密码
- 8081 是ffmpeg推送端口
- 8082 是前端webSocket端口
1.2 启动ffmpeg推流
再起一个服务 开始推流
ffmpeg -I "rtspurl节目源地址" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://127.0.0.1:8081/supersecret
1.3 启动一个http-server
再打开一个命令行进入jsmpeg目录,输入:
http-server
1.4 用浏览器打开网址
http://ip:8080/view-stream.html
正常就能看到视频画面了。
2、多路直播
简单描述下原理, 客户端页面连接websocket将需要查看的直播地址传递过来,websocket服务端通过[FFMPEG],
将直播视频转码为 mpegts 格式发送给客户端, 客户端通过jsmpeg,解码数据 通过canvas 将直播画面绘制在页面上;
但是经测试,停留时间过久,会出现延迟现象,并且同个端口目前浏览器限制为最多6路(可开启http2.0多路复用),本次测试1个端口下分配2路,多路需自行指定相应端口;
详细代码请移步:https://github.com/fanmx/rtsp-jsmpeg
原文地址:https://www.cnblogs.com/fmixue/p/15105395.html
- 我的WCF之旅(4):WCF中的序列化[下篇]
- [WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]
- Android EclipseIDE技巧
- 什么是编译错误,运行时错误及逻辑错误?
- 我的WCF之旅(4):WCF中的序列化[上篇]
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
- 微信年度重磅“小游戏”上线,罗胖一度退出的小程序正在逆袭
- 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
- Android注解学习(1)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- 如何解决分布式系统中的跨时区问题[实例篇]
- Visual Studio对程序集签名时一个很不好用的地方
- 一个关于解决序列化问题的编程技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 快速解决Django关闭Debug模式无法加载media图片与static静态文件
- Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
- Django media static外部访问Django中的图片设置教程
- Python图片处理模块PIL操作方法(pillow)
- Android自定义View实现圆环带数字百分比进度条
- Python按照list dict key进行排序过程解析
- Java并发编程的艺术(一)
- Python3.7 读取音频根据文件名生成脚本的代码
- python如何判断IP地址合法性
- 从*Application.java解读SpringBoot
- django实现后台显示媒体文件
- 服务发现与消费--Eureka与Ribbon的联手出击
- 自我加戏,在自闭的边缘尝试高可用的Eureka
- 视频直播系统源码,图片叠加
- SpringCloud初体验--Hello Eureka