rtsp2web 1.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/dist/rtsp2web.js +46 -7
- package/dist/rtsp2web.js.map +1 -1
- package/dist/rtsp2web.min.js +2 -2
- package/dist/rtsp2web.min.js.map +1 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -6,8 +6,12 @@
|
|
|
6
6
|
[refer](./refer) 是一个小的独立的 `demo` 程序,学习它对你有很大的帮助(都有注释的)。
|
|
7
7
|
|
|
8
8
|
# how to use
|
|
9
|
-
|
|
9
|
+
1、 安装依赖
|
|
10
|
+
```
|
|
11
|
+
npm i rtsp2web
|
|
12
|
+
```
|
|
10
13
|
|
|
14
|
+
2、 创建一个新建 `js` 文件(例如:`main.js`)
|
|
11
15
|
```js
|
|
12
16
|
// main.js
|
|
13
17
|
const RTSP2web = require('rtsp2web')
|
|
@@ -19,8 +23,9 @@ new RTSP2web({
|
|
|
19
23
|
})
|
|
20
24
|
```
|
|
21
25
|
|
|
22
|
-
运行 `node main.js
|
|
26
|
+
3、 运行 `node main.js`,启动视频流转码服务
|
|
23
27
|
|
|
28
|
+
4、 在页面中播放视频
|
|
24
29
|
```html
|
|
25
30
|
// index.html
|
|
26
31
|
<!DOCTYPE html>
|
|
@@ -41,19 +46,20 @@ new RTSP2web({
|
|
|
41
46
|
var rtsp2 = 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4'
|
|
42
47
|
window.onload = () => {
|
|
43
48
|
// 将rtsp视频流地址进行btoa处理一下
|
|
44
|
-
new JSMpeg.Player("ws://localhost:9999/
|
|
49
|
+
new JSMpeg.Player("ws://localhost:9999/rtsp?url="+btoa(rtsp1), {
|
|
45
50
|
canvas : document.getElementById("canvas_1")
|
|
46
51
|
})
|
|
47
|
-
new JSMpeg.Player("ws://localhost:9999/
|
|
52
|
+
new JSMpeg.Player("ws://localhost:9999/rtsp?url="+btoa(rtsp2), {
|
|
48
53
|
canvas : document.getElementById("canvas_2")
|
|
49
54
|
})
|
|
50
55
|
}
|
|
51
56
|
</script>
|
|
52
57
|
</html>
|
|
53
58
|
```
|
|
54
|
-
打开 `index.html`。
|
|
55
59
|
|
|
56
|
-
|
|
60
|
+
> PS: 在页面中播放视频,需要依赖 `jsmpeg.js` 工具包
|
|
61
|
+
|
|
62
|
+
详细参考例子:[https://github.com/Neveryu/rtsp2web/tree/master/example](https://github.com/Neveryu/rtsp2web/tree/master/example)
|
|
57
63
|
|
|
58
64
|
# donate
|
|
59
65
|
If you think rtsp2web help you. maybe you can donate a litter. :beers::beers:
|
package/dist/rtsp2web.js
CHANGED
|
@@ -146,6 +146,10 @@ function _createSuper(Derived) {
|
|
|
146
146
|
};
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
function _readOnlyError(name) {
|
|
150
|
+
throw new TypeError("\"" + name + "\" is read-only");
|
|
151
|
+
}
|
|
152
|
+
|
|
149
153
|
function _toConsumableArray(arr) {
|
|
150
154
|
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
151
155
|
}
|
|
@@ -4762,7 +4766,7 @@ WebSocket.WebSocketServer = WebSocket.Server;
|
|
|
4762
4766
|
|
|
4763
4767
|
var ws = WebSocket;
|
|
4764
4768
|
|
|
4765
|
-
var version = "
|
|
4769
|
+
var version = "2.2.0";
|
|
4766
4770
|
|
|
4767
4771
|
/*!
|
|
4768
4772
|
* name: main.js
|
|
@@ -4780,7 +4784,13 @@ var child = require('child_process');
|
|
|
4780
4784
|
var events = require('events');
|
|
4781
4785
|
|
|
4782
4786
|
var url = require('url');
|
|
4783
|
-
var WebSocketServer = ws.Server;
|
|
4787
|
+
var WebSocketServer = ws.Server; // 默认的ffmpeg路径(一般正常安装的ffmpeg,名称(路径)是:ffmpeg)
|
|
4788
|
+
|
|
4789
|
+
var FFmpegPath = 'ffmpeg'; // 默认的端口
|
|
4790
|
+
|
|
4791
|
+
var defaultPort = 9999; // 默认的视频视口框架大小
|
|
4792
|
+
|
|
4793
|
+
var videoSize = '1920x1080';
|
|
4784
4794
|
/**
|
|
4785
4795
|
* 用于创建一个新的视频转码流类
|
|
4786
4796
|
*/
|
|
@@ -4790,6 +4800,7 @@ var Mpeg2Muxer = /*#__PURE__*/function (_events$EventEmitter) {
|
|
|
4790
4800
|
|
|
4791
4801
|
var _super = _createSuper(Mpeg2Muxer);
|
|
4792
4802
|
|
|
4803
|
+
// 额外的 ffmpeg 参数
|
|
4793
4804
|
function Mpeg2Muxer(options) {
|
|
4794
4805
|
var _this;
|
|
4795
4806
|
|
|
@@ -4806,7 +4817,7 @@ var Mpeg2Muxer = /*#__PURE__*/function (_events$EventEmitter) {
|
|
|
4806
4817
|
_defineProperty(_assertThisInitialized(_this), "inputStreamStarted", false);
|
|
4807
4818
|
|
|
4808
4819
|
_this.options = options;
|
|
4809
|
-
_this.ffmpegPath = options.ffmpegPath;
|
|
4820
|
+
_this.ffmpegPath = options.ffmpegPath || FFmpegPath;
|
|
4810
4821
|
_this.url = options.url;
|
|
4811
4822
|
_this.ffmpegOptions = options.ffmpegOptions;
|
|
4812
4823
|
|
|
@@ -4837,6 +4848,13 @@ var Mpeg2Muxer = /*#__PURE__*/function (_events$EventEmitter) {
|
|
|
4837
4848
|
this.stream = child.spawn(this.ffmpegPath, this.spawnOptions, {
|
|
4838
4849
|
detached: false
|
|
4839
4850
|
});
|
|
4851
|
+
this.stream.on('error', function (code, signal) {
|
|
4852
|
+
console.error('启动ffmpeg时出错,请确保你安装了ffmpeg,然后检查路径或者命令参数');
|
|
4853
|
+
});
|
|
4854
|
+
this.stream.on('close', function (code, signal) {
|
|
4855
|
+
console.log('ffmpeg关闭,code:', code);
|
|
4856
|
+
return _this2.emit('exitWithError');
|
|
4857
|
+
});
|
|
4840
4858
|
this.inputStreamStarted = true;
|
|
4841
4859
|
this.stream.stdout.on('data', function (data) {
|
|
4842
4860
|
return _this2.emit('mpeg2data', data);
|
|
@@ -4910,7 +4928,7 @@ var Channel = /*#__PURE__*/function () {
|
|
|
4910
4928
|
"-stats": "",
|
|
4911
4929
|
// 没有必要值的选项使用空字符串
|
|
4912
4930
|
"-r": 20,
|
|
4913
|
-
"-s":
|
|
4931
|
+
"-s": videoSize,
|
|
4914
4932
|
"-b:v": "2000k"
|
|
4915
4933
|
},
|
|
4916
4934
|
url: this.config.url,
|
|
@@ -4918,6 +4936,11 @@ var Channel = /*#__PURE__*/function () {
|
|
|
4918
4936
|
});
|
|
4919
4937
|
this.mpeg2Muxer.stream = this.mpeg2Muxer.instance.stream;
|
|
4920
4938
|
this.mpeg2Muxer.instance.on('mpeg2data', function (data) {
|
|
4939
|
+
/**
|
|
4940
|
+
* 【广播数据】
|
|
4941
|
+
* rtsp视频流实时转帧之后,当前视频流通道实时进行广播
|
|
4942
|
+
* 将图像数据广播给它的所有client(也就是它的每个ws句柄)
|
|
4943
|
+
*/
|
|
4921
4944
|
_this3.broadcast(data); // this.mpeg2Muxer.data = data
|
|
4922
4945
|
|
|
4923
4946
|
});
|
|
@@ -5009,13 +5032,20 @@ var RTSP2web = /*#__PURE__*/function () {
|
|
|
5009
5032
|
|
|
5010
5033
|
_defineProperty(this, "channels", []);
|
|
5011
5034
|
|
|
5012
|
-
//
|
|
5035
|
+
// 用户可以自定义分辨率
|
|
5036
|
+
if (config && config.videoSize) {
|
|
5037
|
+
if (config.videoSize.includes('x')) {
|
|
5038
|
+
config.videoSize, _readOnlyError("videoSize");
|
|
5039
|
+
}
|
|
5040
|
+
} // RTSP2web是入口类,在入口类中对视频通道进行空闲检测
|
|
5041
|
+
|
|
5042
|
+
|
|
5013
5043
|
setInterval(function () {
|
|
5014
5044
|
return _this5.checkFree();
|
|
5015
5045
|
}, 10000); // 创建websocket服务器,监听在${port}端口
|
|
5016
5046
|
|
|
5017
5047
|
this.wss = new WebSocketServer({
|
|
5018
|
-
port: config ? config.port ||
|
|
5048
|
+
port: config ? config.port || defaultPort : defaultPort
|
|
5019
5049
|
});
|
|
5020
5050
|
/**
|
|
5021
5051
|
* Event: 'connection'成功握手连接时触发
|
|
@@ -5039,7 +5069,7 @@ var RTSP2web = /*#__PURE__*/function () {
|
|
|
5039
5069
|
});
|
|
5040
5070
|
}
|
|
5041
5071
|
|
|
5042
|
-
console.log('ws连接成功');
|
|
5072
|
+
console.log('一个新的client(ws句柄)连接成功');
|
|
5043
5073
|
});
|
|
5044
5074
|
}
|
|
5045
5075
|
/**
|
|
@@ -5080,6 +5110,15 @@ var RTSP2web = /*#__PURE__*/function () {
|
|
|
5080
5110
|
|
|
5081
5111
|
return null;
|
|
5082
5112
|
}
|
|
5113
|
+
/**
|
|
5114
|
+
* 创建一个视频通道
|
|
5115
|
+
* @Author Author
|
|
5116
|
+
* @DateTime 2022-05-06T14:40:28+0800
|
|
5117
|
+
* @param {[type]} data [description]
|
|
5118
|
+
* @param {[type]} ws [description]
|
|
5119
|
+
* @return {[type]} [description]
|
|
5120
|
+
*/
|
|
5121
|
+
|
|
5083
5122
|
}, {
|
|
5084
5123
|
key: "createChannel",
|
|
5085
5124
|
value: function createChannel(data, ws) {
|