node-av 4.0.0 → 5.0.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 +23 -0
- package/binding.gyp +19 -11
- package/dist/api/bitstream-filter.d.ts +13 -12
- package/dist/api/bitstream-filter.js +33 -29
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +211 -96
- package/dist/api/decoder.js +396 -375
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/demuxer.d.ts +10 -10
- package/dist/api/demuxer.js +7 -10
- package/dist/api/demuxer.js.map +1 -1
- package/dist/api/encoder.d.ts +155 -122
- package/dist/api/encoder.js +368 -541
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-complex.d.ts +769 -0
- package/dist/api/filter-complex.js +1596 -0
- package/dist/api/filter-complex.js.map +1 -0
- package/dist/api/filter-presets.d.ts +68 -0
- package/dist/api/filter-presets.js +96 -0
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +183 -113
- package/dist/api/filter.js +347 -365
- package/dist/api/filter.js.map +1 -1
- package/dist/api/fmp4-stream.d.ts +2 -2
- package/dist/api/fmp4-stream.js.map +1 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +3 -3
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/muxer.d.ts +10 -10
- package/dist/api/muxer.js +6 -6
- package/dist/api/muxer.js.map +1 -1
- package/dist/api/pipeline.d.ts +2 -2
- package/dist/api/pipeline.js +22 -22
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/rtp-stream.d.ts +2 -2
- package/dist/api/rtp-stream.js.map +1 -1
- package/dist/api/types.d.ts +63 -7
- package/dist/api/utilities/audio-sample.d.ts +10 -0
- package/dist/api/utilities/audio-sample.js +10 -0
- package/dist/api/utilities/audio-sample.js.map +1 -1
- package/dist/api/utilities/channel-layout.d.ts +1 -0
- package/dist/api/utilities/channel-layout.js +1 -0
- package/dist/api/utilities/channel-layout.js.map +1 -1
- package/dist/api/utilities/image.d.ts +38 -0
- package/dist/api/utilities/image.js +38 -0
- package/dist/api/utilities/image.js.map +1 -1
- package/dist/api/utilities/index.d.ts +1 -0
- package/dist/api/utilities/index.js +2 -0
- package/dist/api/utilities/index.js.map +1 -1
- package/dist/api/utilities/media-type.d.ts +1 -0
- package/dist/api/utilities/media-type.js +1 -0
- package/dist/api/utilities/media-type.js.map +1 -1
- package/dist/api/utilities/pixel-format.d.ts +3 -0
- package/dist/api/utilities/pixel-format.js +3 -0
- package/dist/api/utilities/pixel-format.js.map +1 -1
- package/dist/api/utilities/sample-format.d.ts +5 -0
- package/dist/api/utilities/sample-format.js +5 -0
- package/dist/api/utilities/sample-format.js.map +1 -1
- package/dist/api/utilities/scheduler.d.ts +21 -52
- package/dist/api/utilities/scheduler.js +20 -58
- package/dist/api/utilities/scheduler.js.map +1 -1
- package/dist/api/utilities/streaming.d.ts +32 -1
- package/dist/api/utilities/streaming.js +32 -1
- package/dist/api/utilities/streaming.js.map +1 -1
- package/dist/api/utilities/timestamp.d.ts +14 -0
- package/dist/api/utilities/timestamp.js +14 -0
- package/dist/api/utilities/timestamp.js.map +1 -1
- package/dist/api/utilities/whisper-model.d.ts +310 -0
- package/dist/api/utilities/whisper-model.js +528 -0
- package/dist/api/utilities/whisper-model.js.map +1 -0
- package/dist/api/whisper.d.ts +324 -0
- package/dist/api/whisper.js +362 -0
- package/dist/api/whisper.js.map +1 -0
- package/dist/constants/constants.d.ts +3 -1
- package/dist/constants/constants.js +1 -0
- package/dist/constants/constants.js.map +1 -1
- package/dist/ffmpeg/index.d.ts +3 -3
- package/dist/ffmpeg/index.js +3 -3
- package/dist/ffmpeg/utils.d.ts +27 -0
- package/dist/ffmpeg/utils.js +28 -16
- package/dist/ffmpeg/utils.js.map +1 -1
- package/dist/lib/binding.d.ts +4 -4
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +47 -1
- package/dist/lib/codec-parameters.js +55 -0
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/fifo.d.ts +416 -0
- package/dist/lib/fifo.js +453 -0
- package/dist/lib/fifo.js.map +1 -0
- package/dist/lib/frame.d.ts +96 -1
- package/dist/lib/frame.js +139 -1
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/native-types.d.ts +29 -2
- package/dist/lib/rational.d.ts +18 -0
- package/dist/lib/rational.js +19 -0
- package/dist/lib/rational.js.map +1 -1
- package/dist/lib/types.d.ts +23 -1
- package/install/check.js +2 -2
- package/package.json +30 -20
|
@@ -4,8 +4,7 @@ import type { BitStreamFilterAPI } from '../bitstream-filter.js';
|
|
|
4
4
|
import type { Encoder } from '../encoder.js';
|
|
5
5
|
import type { FilterAPI } from '../filter.js';
|
|
6
6
|
export interface SchedulableComponent<TItem = Packet | Frame> {
|
|
7
|
-
sendToQueue(item: TItem): Promise<void>;
|
|
8
|
-
flushPipeline(): Promise<void>;
|
|
7
|
+
sendToQueue(item: TItem | null): Promise<void>;
|
|
9
8
|
pipeTo(target: FilterAPI | Encoder | BitStreamFilterAPI | Muxer, streamIndex?: number): any;
|
|
10
9
|
}
|
|
11
10
|
/**
|
|
@@ -13,7 +12,7 @@ export interface SchedulableComponent<TItem = Packet | Frame> {
|
|
|
13
12
|
*
|
|
14
13
|
* Allows piping between components (Decoder → Filter → Encoder → Output).
|
|
15
14
|
*/
|
|
16
|
-
export declare class Scheduler<TSend = Packet | Frame>
|
|
15
|
+
export declare class Scheduler<TSend = Packet | Frame> {
|
|
17
16
|
private firstComponent;
|
|
18
17
|
/** @internal */
|
|
19
18
|
lastComponent: SchedulableComponent<any>;
|
|
@@ -84,38 +83,23 @@ export declare class Scheduler<TSend = Packet | Frame> implements AsyncDisposabl
|
|
|
84
83
|
*/
|
|
85
84
|
pipeTo(output: Muxer, streamIndex: number): SchedulerControl<TSend>;
|
|
86
85
|
/**
|
|
87
|
-
* Send an item into the pipeline.
|
|
86
|
+
* Send an item into the pipeline or flush.
|
|
88
87
|
*
|
|
89
|
-
*
|
|
88
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
89
|
+
* When null is provided, triggers flush sequence through all components.
|
|
90
90
|
*
|
|
91
|
-
* @
|
|
92
|
-
* ```typescript
|
|
93
|
-
* try {
|
|
94
|
-
* await scheduler.send(packet);
|
|
95
|
-
* } catch (error) {
|
|
96
|
-
* console.error('Pipeline error:', error);
|
|
97
|
-
* }
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
send(item: TSend): Promise<void>;
|
|
101
|
-
/**
|
|
102
|
-
* Flush the pipeline.
|
|
91
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
103
92
|
*
|
|
104
93
|
* @example
|
|
105
94
|
* ```typescript
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*/
|
|
109
|
-
flush(): Promise<void>;
|
|
110
|
-
/**
|
|
111
|
-
* Cleanup resources.
|
|
95
|
+
* // Send packet for processing
|
|
96
|
+
* await scheduler.send(packet);
|
|
112
97
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* await using scheduler;
|
|
98
|
+
* // Flush pipeline
|
|
99
|
+
* await scheduler.send(null);
|
|
116
100
|
* ```
|
|
117
101
|
*/
|
|
118
|
-
|
|
102
|
+
send(item: TSend | null): Promise<void>;
|
|
119
103
|
}
|
|
120
104
|
/**
|
|
121
105
|
* Control interface for completed pipelines.
|
|
@@ -125,7 +109,7 @@ export declare class Scheduler<TSend = Packet | Frame> implements AsyncDisposabl
|
|
|
125
109
|
*
|
|
126
110
|
* @template TSend - The input type flowing through the pipeline
|
|
127
111
|
*/
|
|
128
|
-
export declare class SchedulerControl<TSend = Packet | Frame>
|
|
112
|
+
export declare class SchedulerControl<TSend = Packet | Frame> {
|
|
129
113
|
private firstComponent;
|
|
130
114
|
/**
|
|
131
115
|
* @param firstComponent - First component in the pipeline
|
|
@@ -134,36 +118,21 @@ export declare class SchedulerControl<TSend = Packet | Frame> implements AsyncDi
|
|
|
134
118
|
*/
|
|
135
119
|
constructor(firstComponent: SchedulableComponent<TSend>);
|
|
136
120
|
/**
|
|
137
|
-
* Send an item into the pipeline.
|
|
121
|
+
* Send an item into the pipeline or flush.
|
|
138
122
|
*
|
|
139
|
-
*
|
|
123
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
124
|
+
* When null is provided, triggers flush sequence through all components.
|
|
140
125
|
*
|
|
141
|
-
* @
|
|
142
|
-
* ```typescript
|
|
143
|
-
* try {
|
|
144
|
-
* await control.send(packet);
|
|
145
|
-
* } catch (error) {
|
|
146
|
-
* console.error('Pipeline error:', error);
|
|
147
|
-
* }
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
send(item: TSend): Promise<void>;
|
|
151
|
-
/**
|
|
152
|
-
* Flush the pipeline.
|
|
126
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
153
127
|
*
|
|
154
128
|
* @example
|
|
155
129
|
* ```typescript
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*/
|
|
159
|
-
flush(): Promise<void>;
|
|
160
|
-
/**
|
|
161
|
-
* Cleanup resources.
|
|
130
|
+
* // Send packet for processing
|
|
131
|
+
* await control.send(packet);
|
|
162
132
|
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* await using control;
|
|
133
|
+
* // Flush pipeline
|
|
134
|
+
* await control.send(null);
|
|
166
135
|
* ```
|
|
167
136
|
*/
|
|
168
|
-
|
|
137
|
+
send(item: TSend | null): Promise<void>;
|
|
169
138
|
}
|
|
@@ -36,43 +36,24 @@ export class Scheduler {
|
|
|
36
36
|
throw new Error('Last component does not support pipeTo');
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Send an item into the pipeline.
|
|
39
|
+
* Send an item into the pipeline or flush.
|
|
40
40
|
*
|
|
41
|
-
*
|
|
41
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
42
|
+
* When null is provided, triggers flush sequence through all components.
|
|
42
43
|
*
|
|
43
|
-
* @
|
|
44
|
-
* ```typescript
|
|
45
|
-
* try {
|
|
46
|
-
* await scheduler.send(packet);
|
|
47
|
-
* } catch (error) {
|
|
48
|
-
* console.error('Pipeline error:', error);
|
|
49
|
-
* }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
async send(item) {
|
|
53
|
-
await this.firstComponent.sendToQueue(item);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Flush the pipeline.
|
|
44
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
57
45
|
*
|
|
58
46
|
* @example
|
|
59
47
|
* ```typescript
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*/
|
|
63
|
-
async flush() {
|
|
64
|
-
await this.firstComponent.flushPipeline();
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Cleanup resources.
|
|
48
|
+
* // Send packet for processing
|
|
49
|
+
* await scheduler.send(packet);
|
|
68
50
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* await using scheduler;
|
|
51
|
+
* // Flush pipeline
|
|
52
|
+
* await scheduler.send(null);
|
|
72
53
|
* ```
|
|
73
54
|
*/
|
|
74
|
-
async
|
|
75
|
-
await this.
|
|
55
|
+
async send(item) {
|
|
56
|
+
await this.firstComponent.sendToQueue(item);
|
|
76
57
|
}
|
|
77
58
|
}
|
|
78
59
|
/**
|
|
@@ -94,43 +75,24 @@ export class SchedulerControl {
|
|
|
94
75
|
this.firstComponent = firstComponent;
|
|
95
76
|
}
|
|
96
77
|
/**
|
|
97
|
-
* Send an item into the pipeline.
|
|
78
|
+
* Send an item into the pipeline or flush.
|
|
98
79
|
*
|
|
99
|
-
*
|
|
80
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
81
|
+
* When null is provided, triggers flush sequence through all components.
|
|
100
82
|
*
|
|
101
|
-
* @
|
|
102
|
-
* ```typescript
|
|
103
|
-
* try {
|
|
104
|
-
* await control.send(packet);
|
|
105
|
-
* } catch (error) {
|
|
106
|
-
* console.error('Pipeline error:', error);
|
|
107
|
-
* }
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
async send(item) {
|
|
111
|
-
await this.firstComponent.sendToQueue(item);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Flush the pipeline.
|
|
83
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
115
84
|
*
|
|
116
85
|
* @example
|
|
117
86
|
* ```typescript
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*/
|
|
121
|
-
async flush() {
|
|
122
|
-
await this.firstComponent.flushPipeline();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Cleanup resources.
|
|
87
|
+
* // Send packet for processing
|
|
88
|
+
* await control.send(packet);
|
|
126
89
|
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* await using control;
|
|
90
|
+
* // Flush pipeline
|
|
91
|
+
* await control.send(null);
|
|
130
92
|
* ```
|
|
131
93
|
*/
|
|
132
|
-
async
|
|
133
|
-
await this.
|
|
94
|
+
async send(item) {
|
|
95
|
+
await this.firstComponent.sendToQueue(item);
|
|
134
96
|
}
|
|
135
97
|
}
|
|
136
98
|
//# sourceMappingURL=scheduler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/api/utilities/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/api/utilities/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACZ,cAAc,CAA8B;IAEpD,gBAAgB;IAChB,aAAa,CAA4B;IAEzC;;;;;;OAMG;IACH,YAAY,cAA2C,EAAE,aAAyC;QAChG,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,cAAc,CAAC;IACvD,CAAC;IAgED,MAAM,CAAC,MAAwD,EAAE,WAAoB;QACnF,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpD,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;gBAC5B,0CAA0C;gBAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC/C,kEAAkE;gBAClE,OAAO,IAAI,gBAAgB,CAAQ,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1D,gEAAgE;gBAChE,OAAO,IAAI,SAAS,CAAQ,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,IAAI,CAAC,IAAkB;QAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IACnB,cAAc,CAA8B;IAEpD;;;;OAIG;IACH,YAAY,cAA2C;QACrD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,IAAI,CAAC,IAAkB;QAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -31,7 +31,7 @@ export declare class StreamingUtils {
|
|
|
31
31
|
* configured demuxer/muxer. The inputs/outputs should be configured with RTP
|
|
32
32
|
* format and have their streams set up before calling this method.
|
|
33
33
|
*
|
|
34
|
-
* @param
|
|
34
|
+
* @param contexts - Alternatively, array of FormatContext objects
|
|
35
35
|
*
|
|
36
36
|
* @returns SDP string if successful, null if failed
|
|
37
37
|
*
|
|
@@ -60,6 +60,7 @@ export declare class StreamingUtils {
|
|
|
60
60
|
* This ensures correct codec names, clock rates, and formatting for all codecs.
|
|
61
61
|
*
|
|
62
62
|
* @param configs - Array of stream configurations
|
|
63
|
+
*
|
|
63
64
|
* @param sessionName - Optional session name for the SDP (default: 'RTP Stream')
|
|
64
65
|
*
|
|
65
66
|
* @returns SDP string with proper rtpmap and optional crypto attributes
|
|
@@ -106,6 +107,7 @@ export declare class StreamingUtils {
|
|
|
106
107
|
* Validate if an output is configured for RTP streaming
|
|
107
108
|
*
|
|
108
109
|
* @param output - Muxer to check
|
|
110
|
+
*
|
|
109
111
|
* @returns true if configured for RTP
|
|
110
112
|
*
|
|
111
113
|
* @example
|
|
@@ -123,8 +125,19 @@ export declare class StreamingUtils {
|
|
|
123
125
|
* Helper to construct RTP URLs with proper formatting.
|
|
124
126
|
*
|
|
125
127
|
* @param host - IP address or hostname
|
|
128
|
+
*
|
|
126
129
|
* @param port - Port number
|
|
130
|
+
*
|
|
127
131
|
* @param options - Additional options
|
|
132
|
+
*
|
|
133
|
+
* @param options.ttl - Time-to-live for multicast
|
|
134
|
+
*
|
|
135
|
+
* @param options.localrtpport - Local RTP port
|
|
136
|
+
*
|
|
137
|
+
* @param options.localrtcpport - Local RTCP port
|
|
138
|
+
*
|
|
139
|
+
* @param options.pkt_size - Packet size
|
|
140
|
+
*
|
|
128
141
|
* @returns Formatted RTP URL
|
|
129
142
|
*
|
|
130
143
|
* @example
|
|
@@ -150,6 +163,24 @@ export declare class StreamingUtils {
|
|
|
150
163
|
* @param sdp - SDP content string
|
|
151
164
|
*
|
|
152
165
|
* @returns Array of port numbers (one per stream)
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* import { StreamingUtils } from 'node-av/api';
|
|
170
|
+
*
|
|
171
|
+
* const sdp = `v=0
|
|
172
|
+
* o=- 0 0 IN IP4 127.0.0.1
|
|
173
|
+
* s=Test Stream
|
|
174
|
+
* c=IN IP4 127.0.0.1
|
|
175
|
+
* t=0 0
|
|
176
|
+
* m=audio 5004 RTP/AVP 111
|
|
177
|
+
* a=rtpmap:111 OPUS/48000/2
|
|
178
|
+
* m=video 5006 RTP/AVP 96
|
|
179
|
+
* a=rtpmap:96 H264/90000`;
|
|
180
|
+
*
|
|
181
|
+
* const ports = StreamingUtils.extractPortsFromSDP(sdp);
|
|
182
|
+
* console.log(ports); // [5004, 5006]
|
|
183
|
+
* ```
|
|
153
184
|
*/
|
|
154
185
|
static extractPortsFromSDP(sdp: string): number[];
|
|
155
186
|
}
|
|
@@ -33,7 +33,7 @@ export class StreamingUtils {
|
|
|
33
33
|
* configured demuxer/muxer. The inputs/outputs should be configured with RTP
|
|
34
34
|
* format and have their streams set up before calling this method.
|
|
35
35
|
*
|
|
36
|
-
* @param
|
|
36
|
+
* @param contexts - Alternatively, array of FormatContext objects
|
|
37
37
|
*
|
|
38
38
|
* @returns SDP string if successful, null if failed
|
|
39
39
|
*
|
|
@@ -67,6 +67,7 @@ export class StreamingUtils {
|
|
|
67
67
|
* This ensures correct codec names, clock rates, and formatting for all codecs.
|
|
68
68
|
*
|
|
69
69
|
* @param configs - Array of stream configurations
|
|
70
|
+
*
|
|
70
71
|
* @param sessionName - Optional session name for the SDP (default: 'RTP Stream')
|
|
71
72
|
*
|
|
72
73
|
* @returns SDP string with proper rtpmap and optional crypto attributes
|
|
@@ -195,6 +196,7 @@ export class StreamingUtils {
|
|
|
195
196
|
* Validate if an output is configured for RTP streaming
|
|
196
197
|
*
|
|
197
198
|
* @param output - Muxer to check
|
|
199
|
+
*
|
|
198
200
|
* @returns true if configured for RTP
|
|
199
201
|
*
|
|
200
202
|
* @example
|
|
@@ -221,8 +223,19 @@ export class StreamingUtils {
|
|
|
221
223
|
* Helper to construct RTP URLs with proper formatting.
|
|
222
224
|
*
|
|
223
225
|
* @param host - IP address or hostname
|
|
226
|
+
*
|
|
224
227
|
* @param port - Port number
|
|
228
|
+
*
|
|
225
229
|
* @param options - Additional options
|
|
230
|
+
*
|
|
231
|
+
* @param options.ttl - Time-to-live for multicast
|
|
232
|
+
*
|
|
233
|
+
* @param options.localrtpport - Local RTP port
|
|
234
|
+
*
|
|
235
|
+
* @param options.localrtcpport - Local RTCP port
|
|
236
|
+
*
|
|
237
|
+
* @param options.pkt_size - Packet size
|
|
238
|
+
*
|
|
226
239
|
* @returns Formatted RTP URL
|
|
227
240
|
*
|
|
228
241
|
* @example
|
|
@@ -258,6 +271,24 @@ export class StreamingUtils {
|
|
|
258
271
|
* @param sdp - SDP content string
|
|
259
272
|
*
|
|
260
273
|
* @returns Array of port numbers (one per stream)
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* import { StreamingUtils } from 'node-av/api';
|
|
278
|
+
*
|
|
279
|
+
* const sdp = `v=0
|
|
280
|
+
* o=- 0 0 IN IP4 127.0.0.1
|
|
281
|
+
* s=Test Stream
|
|
282
|
+
* c=IN IP4 127.0.0.1
|
|
283
|
+
* t=0 0
|
|
284
|
+
* m=audio 5004 RTP/AVP 111
|
|
285
|
+
* a=rtpmap:111 OPUS/48000/2
|
|
286
|
+
* m=video 5006 RTP/AVP 96
|
|
287
|
+
* a=rtpmap:96 H264/90000`;
|
|
288
|
+
*
|
|
289
|
+
* const ports = StreamingUtils.extractPortsFromSDP(sdp);
|
|
290
|
+
* console.log(ports); // [5004, 5006]
|
|
291
|
+
* ```
|
|
261
292
|
*/
|
|
262
293
|
static extractPortsFromSDP(sdp) {
|
|
263
294
|
const ports = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/api/utilities/streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,cAAc;IACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,SAAS,CAAC,QAAyB;QACxC,IAAI,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/api/utilities/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ export declare class TimestampUtils {
|
|
|
36
36
|
* Direct mapping to av_ts2str()
|
|
37
37
|
*
|
|
38
38
|
* @param ts - Timestamp value (bigint or number), or null
|
|
39
|
+
*
|
|
39
40
|
* @returns String representation
|
|
40
41
|
*
|
|
41
42
|
* @example
|
|
@@ -56,7 +57,9 @@ export declare class TimestampUtils {
|
|
|
56
57
|
* Direct mapping to av_ts2timestr()
|
|
57
58
|
*
|
|
58
59
|
* @param ts - Timestamp value
|
|
60
|
+
*
|
|
59
61
|
* @param timeBase - Time base for conversion
|
|
62
|
+
*
|
|
60
63
|
* @returns Time string in seconds with decimal places
|
|
61
64
|
*
|
|
62
65
|
* @example
|
|
@@ -78,9 +81,13 @@ export declare class TimestampUtils {
|
|
|
78
81
|
* Direct mapping to av_compare_ts()
|
|
79
82
|
*
|
|
80
83
|
* @param tsA - First timestamp
|
|
84
|
+
*
|
|
81
85
|
* @param tbA - Time base of first timestamp
|
|
86
|
+
*
|
|
82
87
|
* @param tsB - Second timestamp
|
|
88
|
+
*
|
|
83
89
|
* @param tbB - Time base of second timestamp
|
|
90
|
+
*
|
|
84
91
|
* @returns -1 if tsA < tsB, 0 if equal, 1 if tsA > tsB
|
|
85
92
|
*
|
|
86
93
|
* @example
|
|
@@ -107,8 +114,11 @@ export declare class TimestampUtils {
|
|
|
107
114
|
* Direct mapping to av_rescale_q()
|
|
108
115
|
*
|
|
109
116
|
* @param a - Timestamp to rescale
|
|
117
|
+
*
|
|
110
118
|
* @param bq - Source time base
|
|
119
|
+
*
|
|
111
120
|
* @param cq - Destination time base
|
|
121
|
+
*
|
|
112
122
|
* @returns Rescaled timestamp
|
|
113
123
|
*
|
|
114
124
|
* @example
|
|
@@ -133,9 +143,13 @@ export declare class TimestampUtils {
|
|
|
133
143
|
* Direct mapping to av_rescale_rnd()
|
|
134
144
|
*
|
|
135
145
|
* @param a - Value to rescale
|
|
146
|
+
*
|
|
136
147
|
* @param b - Multiplier
|
|
148
|
+
*
|
|
137
149
|
* @param c - Divisor
|
|
150
|
+
*
|
|
138
151
|
* @param rnd - Rounding mode
|
|
152
|
+
*
|
|
139
153
|
* @returns Rescaled value: a * b / c
|
|
140
154
|
*
|
|
141
155
|
* @example
|
|
@@ -36,6 +36,7 @@ export class TimestampUtils {
|
|
|
36
36
|
* Direct mapping to av_ts2str()
|
|
37
37
|
*
|
|
38
38
|
* @param ts - Timestamp value (bigint or number), or null
|
|
39
|
+
*
|
|
39
40
|
* @returns String representation
|
|
40
41
|
*
|
|
41
42
|
* @example
|
|
@@ -58,7 +59,9 @@ export class TimestampUtils {
|
|
|
58
59
|
* Direct mapping to av_ts2timestr()
|
|
59
60
|
*
|
|
60
61
|
* @param ts - Timestamp value
|
|
62
|
+
*
|
|
61
63
|
* @param timeBase - Time base for conversion
|
|
64
|
+
*
|
|
62
65
|
* @returns Time string in seconds with decimal places
|
|
63
66
|
*
|
|
64
67
|
* @example
|
|
@@ -82,9 +85,13 @@ export class TimestampUtils {
|
|
|
82
85
|
* Direct mapping to av_compare_ts()
|
|
83
86
|
*
|
|
84
87
|
* @param tsA - First timestamp
|
|
88
|
+
*
|
|
85
89
|
* @param tbA - Time base of first timestamp
|
|
90
|
+
*
|
|
86
91
|
* @param tsB - Second timestamp
|
|
92
|
+
*
|
|
87
93
|
* @param tbB - Time base of second timestamp
|
|
94
|
+
*
|
|
88
95
|
* @returns -1 if tsA < tsB, 0 if equal, 1 if tsA > tsB
|
|
89
96
|
*
|
|
90
97
|
* @example
|
|
@@ -113,8 +120,11 @@ export class TimestampUtils {
|
|
|
113
120
|
* Direct mapping to av_rescale_q()
|
|
114
121
|
*
|
|
115
122
|
* @param a - Timestamp to rescale
|
|
123
|
+
*
|
|
116
124
|
* @param bq - Source time base
|
|
125
|
+
*
|
|
117
126
|
* @param cq - Destination time base
|
|
127
|
+
*
|
|
118
128
|
* @returns Rescaled timestamp
|
|
119
129
|
*
|
|
120
130
|
* @example
|
|
@@ -141,9 +151,13 @@ export class TimestampUtils {
|
|
|
141
151
|
* Direct mapping to av_rescale_rnd()
|
|
142
152
|
*
|
|
143
153
|
* @param a - Value to rescale
|
|
154
|
+
*
|
|
144
155
|
* @param b - Multiplier
|
|
156
|
+
*
|
|
145
157
|
* @param c - Divisor
|
|
158
|
+
*
|
|
146
159
|
* @param rnd - Rounding mode
|
|
160
|
+
*
|
|
147
161
|
* @returns Rescaled value: a * b / c
|
|
148
162
|
*
|
|
149
163
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/api/utilities/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/api/utilities/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,QAAQ,CAAC,EAA0B;QACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,YAAY,CAAC,EAA0B,EAAE,QAAmB;QACjE,OAAO,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,OAAO,CAAC,GAA2B,EAAE,GAAc,EAAE,GAA2B,EAAE,GAAc;QACrG,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,OAAO,CAAC,CAAyB,EAAE,EAAa,EAAE,EAAa;QACpE,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,MAAM,CAAC,cAAc,CAAC,CAAkB,EAAE,CAAkB,EAAE,CAAkB,EAAE,GAAe;QAC/F,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
|