node-av 3.1.3 → 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 +88 -52
- package/binding.gyp +23 -11
- package/dist/api/audio-frame-buffer.d.ts +201 -0
- package/dist/api/audio-frame-buffer.js +275 -0
- package/dist/api/audio-frame-buffer.js.map +1 -0
- package/dist/api/bitstream-filter.d.ts +320 -78
- package/dist/api/bitstream-filter.js +684 -151
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/constants.d.ts +44 -0
- package/dist/api/constants.js +45 -0
- package/dist/api/constants.js.map +1 -0
- package/dist/api/data/test_av1.ivf +0 -0
- package/dist/api/data/test_mjpeg.mjpeg +0 -0
- package/dist/api/data/test_vp8.ivf +0 -0
- package/dist/api/data/test_vp9.ivf +0 -0
- package/dist/api/decoder.d.ts +454 -77
- package/dist/api/decoder.js +1081 -271
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/{media-input.d.ts → demuxer.d.ts} +295 -45
- package/dist/api/demuxer.js +1965 -0
- package/dist/api/demuxer.js.map +1 -0
- package/dist/api/encoder.d.ts +423 -132
- package/dist/api/encoder.js +1089 -240
- 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 +80 -5
- package/dist/api/filter-presets.js +117 -7
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +561 -125
- package/dist/api/filter.js +1083 -274
- package/dist/api/filter.js.map +1 -1
- package/dist/api/{fmp4.d.ts → fmp4-stream.d.ts} +141 -140
- package/dist/api/fmp4-stream.js +539 -0
- package/dist/api/fmp4-stream.js.map +1 -0
- package/dist/api/hardware.d.ts +58 -6
- package/dist/api/hardware.js +127 -11
- package/dist/api/hardware.js.map +1 -1
- package/dist/api/index.d.ts +8 -4
- package/dist/api/index.js +17 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +6 -6
- package/dist/api/io-stream.js +5 -4
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/{media-output.d.ts → muxer.d.ts} +280 -66
- package/dist/api/muxer.js +1934 -0
- package/dist/api/muxer.js.map +1 -0
- package/dist/api/pipeline.d.ts +77 -29
- package/dist/api/pipeline.js +449 -439
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/rtp-stream.d.ts +312 -0
- package/dist/api/rtp-stream.js +630 -0
- package/dist/api/rtp-stream.js.map +1 -0
- package/dist/api/types.d.ts +533 -56
- package/dist/api/utilities/async-queue.d.ts +91 -0
- package/dist/api/utilities/async-queue.js +162 -0
- package/dist/api/utilities/async-queue.js.map +1 -0
- package/dist/api/utilities/audio-sample.d.ts +11 -1
- 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 +39 -1
- package/dist/api/utilities/image.js +38 -0
- package/dist/api/utilities/image.js.map +1 -1
- package/dist/api/utilities/index.d.ts +3 -0
- package/dist/api/utilities/index.js +6 -0
- package/dist/api/utilities/index.js.map +1 -1
- package/dist/api/utilities/media-type.d.ts +2 -1
- 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 +4 -1
- 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 +6 -1
- 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 +138 -0
- package/dist/api/utilities/scheduler.js +98 -0
- package/dist/api/utilities/scheduler.js.map +1 -0
- package/dist/api/utilities/streaming.d.ts +105 -15
- package/dist/api/utilities/streaming.js +201 -12
- package/dist/api/utilities/streaming.js.map +1 -1
- package/dist/api/utilities/timestamp.d.ts +15 -1
- 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/webrtc-stream.d.ts +288 -0
- package/dist/api/webrtc-stream.js +440 -0
- package/dist/api/webrtc-stream.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 +54 -2
- package/dist/constants/constants.js +48 -1
- package/dist/constants/constants.js.map +1 -1
- package/dist/constants/encoders.d.ts +2 -1
- package/dist/constants/encoders.js +4 -3
- package/dist/constants/encoders.js.map +1 -1
- package/dist/constants/hardware.d.ts +26 -0
- package/dist/constants/hardware.js +27 -0
- package/dist/constants/hardware.js.map +1 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/constants/index.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 +22 -11
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/codec-context.d.ts +87 -0
- package/dist/lib/codec-context.js +125 -4
- package/dist/lib/codec-context.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +229 -1
- package/dist/lib/codec-parameters.js +264 -0
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/codec-parser.d.ts +23 -0
- package/dist/lib/codec-parser.js +25 -0
- package/dist/lib/codec-parser.js.map +1 -1
- package/dist/lib/codec.d.ts +26 -4
- package/dist/lib/codec.js +35 -0
- package/dist/lib/codec.js.map +1 -1
- package/dist/lib/dictionary.js +1 -0
- package/dist/lib/dictionary.js.map +1 -1
- package/dist/lib/error.js +1 -1
- package/dist/lib/error.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/filter-context.d.ts +52 -11
- package/dist/lib/filter-context.js +56 -12
- package/dist/lib/filter-context.js.map +1 -1
- package/dist/lib/filter-graph.d.ts +9 -0
- package/dist/lib/filter-graph.js +13 -0
- package/dist/lib/filter-graph.js.map +1 -1
- package/dist/lib/filter.d.ts +21 -0
- package/dist/lib/filter.js +28 -0
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/format-context.d.ts +48 -14
- package/dist/lib/format-context.js +76 -7
- package/dist/lib/format-context.js.map +1 -1
- package/dist/lib/frame.d.ts +264 -1
- package/dist/lib/frame.js +351 -1
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/hardware-device-context.d.ts +3 -2
- package/dist/lib/hardware-device-context.js.map +1 -1
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/input-format.d.ts +21 -0
- package/dist/lib/input-format.js +42 -2
- package/dist/lib/input-format.js.map +1 -1
- package/dist/lib/native-types.d.ts +76 -27
- package/dist/lib/option.d.ts +25 -13
- package/dist/lib/option.js +28 -0
- package/dist/lib/option.js.map +1 -1
- package/dist/lib/output-format.d.ts +22 -1
- package/dist/lib/output-format.js +28 -0
- package/dist/lib/output-format.js.map +1 -1
- package/dist/lib/packet.d.ts +35 -0
- package/dist/lib/packet.js +52 -2
- package/dist/lib/packet.js.map +1 -1
- 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/stream.d.ts +126 -0
- package/dist/lib/stream.js +188 -5
- package/dist/lib/stream.js.map +1 -1
- package/dist/lib/sync-queue.d.ts +179 -0
- package/dist/lib/sync-queue.js +197 -0
- package/dist/lib/sync-queue.js.map +1 -0
- package/dist/lib/types.d.ts +49 -1
- package/dist/lib/utilities.d.ts +281 -53
- package/dist/lib/utilities.js +298 -55
- package/dist/lib/utilities.js.map +1 -1
- package/install/check.js +2 -2
- package/package.json +37 -26
- package/dist/api/fmp4.js +0 -710
- package/dist/api/fmp4.js.map +0 -1
- package/dist/api/media-input.js +0 -1075
- package/dist/api/media-input.js.map +0 -1
- package/dist/api/media-output.js +0 -1040
- package/dist/api/media-output.js.map +0 -1
- package/dist/api/webrtc.d.ts +0 -664
- package/dist/api/webrtc.js +0 -1132
- package/dist/api/webrtc.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAqB;QAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,UAAU,CAAC,MAAqB;QACrC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AVSampleFormat } from '../../constants/
|
|
1
|
+
import type { AVSampleFormat } from '../../constants/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Audio sample format utilities.
|
|
4
4
|
*
|
|
@@ -30,6 +30,7 @@ export declare class SampleFormatUtils {
|
|
|
30
30
|
* Direct mapping to av_get_bytes_per_sample()
|
|
31
31
|
*
|
|
32
32
|
* @param format - Audio sample format
|
|
33
|
+
*
|
|
33
34
|
* @returns Number of bytes per sample, or 0 for invalid format
|
|
34
35
|
*
|
|
35
36
|
* @example
|
|
@@ -49,6 +50,7 @@ export declare class SampleFormatUtils {
|
|
|
49
50
|
* Direct mapping to av_get_sample_fmt_name()
|
|
50
51
|
*
|
|
51
52
|
* @param format - Audio sample format
|
|
53
|
+
*
|
|
52
54
|
* @returns Format name string, or null for invalid format
|
|
53
55
|
*
|
|
54
56
|
* @example
|
|
@@ -69,6 +71,7 @@ export declare class SampleFormatUtils {
|
|
|
69
71
|
* Direct mapping to av_get_packed_sample_fmt()
|
|
70
72
|
*
|
|
71
73
|
* @param format - Audio sample format
|
|
74
|
+
*
|
|
72
75
|
* @returns Packed sample format
|
|
73
76
|
*
|
|
74
77
|
* @example
|
|
@@ -89,6 +92,7 @@ export declare class SampleFormatUtils {
|
|
|
89
92
|
* Direct mapping to av_get_planar_sample_fmt()
|
|
90
93
|
*
|
|
91
94
|
* @param format - Audio sample format
|
|
95
|
+
*
|
|
92
96
|
* @returns Planar sample format
|
|
93
97
|
*
|
|
94
98
|
* @example
|
|
@@ -109,6 +113,7 @@ export declare class SampleFormatUtils {
|
|
|
109
113
|
* Direct mapping to av_sample_fmt_is_planar()
|
|
110
114
|
*
|
|
111
115
|
* @param format - Audio sample format
|
|
116
|
+
*
|
|
112
117
|
* @returns True if format is planar, false if packed/interleaved
|
|
113
118
|
*
|
|
114
119
|
* @example
|
|
@@ -31,6 +31,7 @@ export class SampleFormatUtils {
|
|
|
31
31
|
* Direct mapping to av_get_bytes_per_sample()
|
|
32
32
|
*
|
|
33
33
|
* @param format - Audio sample format
|
|
34
|
+
*
|
|
34
35
|
* @returns Number of bytes per sample, or 0 for invalid format
|
|
35
36
|
*
|
|
36
37
|
* @example
|
|
@@ -52,6 +53,7 @@ export class SampleFormatUtils {
|
|
|
52
53
|
* Direct mapping to av_get_sample_fmt_name()
|
|
53
54
|
*
|
|
54
55
|
* @param format - Audio sample format
|
|
56
|
+
*
|
|
55
57
|
* @returns Format name string, or null for invalid format
|
|
56
58
|
*
|
|
57
59
|
* @example
|
|
@@ -74,6 +76,7 @@ export class SampleFormatUtils {
|
|
|
74
76
|
* Direct mapping to av_get_packed_sample_fmt()
|
|
75
77
|
*
|
|
76
78
|
* @param format - Audio sample format
|
|
79
|
+
*
|
|
77
80
|
* @returns Packed sample format
|
|
78
81
|
*
|
|
79
82
|
* @example
|
|
@@ -96,6 +99,7 @@ export class SampleFormatUtils {
|
|
|
96
99
|
* Direct mapping to av_get_planar_sample_fmt()
|
|
97
100
|
*
|
|
98
101
|
* @param format - Audio sample format
|
|
102
|
+
*
|
|
99
103
|
* @returns Planar sample format
|
|
100
104
|
*
|
|
101
105
|
* @example
|
|
@@ -118,6 +122,7 @@ export class SampleFormatUtils {
|
|
|
118
122
|
* Direct mapping to av_sample_fmt_is_planar()
|
|
119
123
|
*
|
|
120
124
|
* @param format - Audio sample format
|
|
125
|
+
*
|
|
121
126
|
* @returns True if format is planar, false if packed/interleaved
|
|
122
127
|
*
|
|
123
128
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAsB;QAC7C,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAsB;QACnC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAsB;QACpC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Muxer } from '../muxer.js';
|
|
2
|
+
import type { Frame, Packet } from '../../lib/index.js';
|
|
3
|
+
import type { BitStreamFilterAPI } from '../bitstream-filter.js';
|
|
4
|
+
import type { Encoder } from '../encoder.js';
|
|
5
|
+
import type { FilterAPI } from '../filter.js';
|
|
6
|
+
export interface SchedulableComponent<TItem = Packet | Frame> {
|
|
7
|
+
sendToQueue(item: TItem | null): Promise<void>;
|
|
8
|
+
pipeTo(target: FilterAPI | Encoder | BitStreamFilterAPI | Muxer, streamIndex?: number): any;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Pipeline scheduler for chaining components.
|
|
12
|
+
*
|
|
13
|
+
* Allows piping between components (Decoder → Filter → Encoder → Output).
|
|
14
|
+
*/
|
|
15
|
+
export declare class Scheduler<TSend = Packet | Frame> {
|
|
16
|
+
private firstComponent;
|
|
17
|
+
/** @internal */
|
|
18
|
+
lastComponent: SchedulableComponent<any>;
|
|
19
|
+
/**
|
|
20
|
+
* @param firstComponent - First component in the pipeline
|
|
21
|
+
*
|
|
22
|
+
* @param lastComponent - Last component in the pipeline (defaults to firstComponent)
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
constructor(firstComponent: SchedulableComponent<TSend>, lastComponent?: SchedulableComponent<any>);
|
|
27
|
+
/**
|
|
28
|
+
* Pipe output to a filter component.
|
|
29
|
+
*
|
|
30
|
+
* @param target - Filter to receive frames
|
|
31
|
+
*
|
|
32
|
+
* @returns Scheduler for continued chaining
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* decoder.pipeTo(filter1).pipeTo(filter2)
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
pipeTo(target: FilterAPI): Scheduler<TSend>;
|
|
40
|
+
/**
|
|
41
|
+
* Pipe output to an encoder component.
|
|
42
|
+
*
|
|
43
|
+
* @param target - Encoder to receive frames
|
|
44
|
+
*
|
|
45
|
+
* @returns Scheduler for continued chaining
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* decoder.pipeTo(filter).pipeTo(encoder)
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
pipeTo(target: Encoder): Scheduler<TSend>;
|
|
53
|
+
/**
|
|
54
|
+
* Pipe output to a bitstream filter component.
|
|
55
|
+
*
|
|
56
|
+
* @param target - BitStreamFilter to receive packets
|
|
57
|
+
*
|
|
58
|
+
* @returns Scheduler for continued chaining
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* decoder.pipeTo(encoder).pipeTo(bsf).pipeTo(output, 0)
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
pipeTo(target: BitStreamFilterAPI): Scheduler<TSend>;
|
|
66
|
+
/**
|
|
67
|
+
* Pipe output to a muxer (final stage).
|
|
68
|
+
*
|
|
69
|
+
* @param output - Muxer to write to
|
|
70
|
+
*
|
|
71
|
+
* @param streamIndex - Stream index in output
|
|
72
|
+
*
|
|
73
|
+
* @returns Control interface without pipeTo
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const control = decoder
|
|
78
|
+
* .pipeTo(encoder)
|
|
79
|
+
* .pipeTo(output, 0);
|
|
80
|
+
*
|
|
81
|
+
* await control.send(packet);
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
pipeTo(output: Muxer, streamIndex: number): SchedulerControl<TSend>;
|
|
85
|
+
/**
|
|
86
|
+
* Send an item into the pipeline or flush.
|
|
87
|
+
*
|
|
88
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
89
|
+
* When null is provided, triggers flush sequence through all components.
|
|
90
|
+
*
|
|
91
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* // Send packet for processing
|
|
96
|
+
* await scheduler.send(packet);
|
|
97
|
+
*
|
|
98
|
+
* // Flush pipeline
|
|
99
|
+
* await scheduler.send(null);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
send(item: TSend | null): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Control interface for completed pipelines.
|
|
106
|
+
*
|
|
107
|
+
* Provides control methods without pipeTo() - this is the final
|
|
108
|
+
* stage after piping to Muxer.
|
|
109
|
+
*
|
|
110
|
+
* @template TSend - The input type flowing through the pipeline
|
|
111
|
+
*/
|
|
112
|
+
export declare class SchedulerControl<TSend = Packet | Frame> {
|
|
113
|
+
private firstComponent;
|
|
114
|
+
/**
|
|
115
|
+
* @param firstComponent - First component in the pipeline
|
|
116
|
+
*
|
|
117
|
+
* @internal
|
|
118
|
+
*/
|
|
119
|
+
constructor(firstComponent: SchedulableComponent<TSend>);
|
|
120
|
+
/**
|
|
121
|
+
* Send an item into the pipeline or flush.
|
|
122
|
+
*
|
|
123
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
124
|
+
* When null is provided, triggers flush sequence through all components.
|
|
125
|
+
*
|
|
126
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* // Send packet for processing
|
|
131
|
+
* await control.send(packet);
|
|
132
|
+
*
|
|
133
|
+
* // Flush pipeline
|
|
134
|
+
* await control.send(null);
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
send(item: TSend | null): Promise<void>;
|
|
138
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Muxer } from '../muxer.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pipeline scheduler for chaining components.
|
|
4
|
+
*
|
|
5
|
+
* Allows piping between components (Decoder → Filter → Encoder → Output).
|
|
6
|
+
*/
|
|
7
|
+
export class Scheduler {
|
|
8
|
+
firstComponent;
|
|
9
|
+
/** @internal */
|
|
10
|
+
lastComponent;
|
|
11
|
+
/**
|
|
12
|
+
* @param firstComponent - First component in the pipeline
|
|
13
|
+
*
|
|
14
|
+
* @param lastComponent - Last component in the pipeline (defaults to firstComponent)
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
constructor(firstComponent, lastComponent) {
|
|
19
|
+
this.firstComponent = firstComponent;
|
|
20
|
+
this.lastComponent = lastComponent ?? firstComponent;
|
|
21
|
+
}
|
|
22
|
+
pipeTo(target, streamIndex) {
|
|
23
|
+
if (typeof this.lastComponent.pipeTo === 'function') {
|
|
24
|
+
if (target instanceof Muxer) {
|
|
25
|
+
// Start the pipe task (encoder -> output)
|
|
26
|
+
this.lastComponent.pipeTo(target, streamIndex);
|
|
27
|
+
// Return control with correct firstComponent (not lastComponent!)
|
|
28
|
+
return new SchedulerControl(this.firstComponent);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const resultScheduler = this.lastComponent.pipeTo(target);
|
|
32
|
+
// Keep the original firstComponent, update to new lastComponent
|
|
33
|
+
return new Scheduler(this.firstComponent, resultScheduler.lastComponent);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
throw new Error('Last component does not support pipeTo');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Send an item into the pipeline or flush.
|
|
40
|
+
*
|
|
41
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
42
|
+
* When null is provided, triggers flush sequence through all components.
|
|
43
|
+
*
|
|
44
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* // Send packet for processing
|
|
49
|
+
* await scheduler.send(packet);
|
|
50
|
+
*
|
|
51
|
+
* // Flush pipeline
|
|
52
|
+
* await scheduler.send(null);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
async send(item) {
|
|
56
|
+
await this.firstComponent.sendToQueue(item);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Control interface for completed pipelines.
|
|
61
|
+
*
|
|
62
|
+
* Provides control methods without pipeTo() - this is the final
|
|
63
|
+
* stage after piping to Muxer.
|
|
64
|
+
*
|
|
65
|
+
* @template TSend - The input type flowing through the pipeline
|
|
66
|
+
*/
|
|
67
|
+
export class SchedulerControl {
|
|
68
|
+
firstComponent;
|
|
69
|
+
/**
|
|
70
|
+
* @param firstComponent - First component in the pipeline
|
|
71
|
+
*
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
constructor(firstComponent) {
|
|
75
|
+
this.firstComponent = firstComponent;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Send an item into the pipeline or flush.
|
|
79
|
+
*
|
|
80
|
+
* When item is provided, queues it for processing through the pipeline.
|
|
81
|
+
* When null is provided, triggers flush sequence through all components.
|
|
82
|
+
*
|
|
83
|
+
* @param item - Packet or Frame to process, or null to flush
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // Send packet for processing
|
|
88
|
+
* await control.send(packet);
|
|
89
|
+
*
|
|
90
|
+
* // Flush pipeline
|
|
91
|
+
* await control.send(null);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async send(item) {
|
|
95
|
+
await this.firstComponent.sendToQueue(item);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
1
|
+
import { FormatContext } from '../../lib/format-context.js';
|
|
2
|
+
import type { AVCodecID } from '../../constants/index.js';
|
|
3
|
+
import type { Muxer } from '../muxer.js';
|
|
3
4
|
/**
|
|
4
5
|
* Streaming protocol utilities.
|
|
5
6
|
*
|
|
@@ -8,11 +9,11 @@ import type { MediaOutput } from '../media-output.js';
|
|
|
8
9
|
*
|
|
9
10
|
* @example
|
|
10
11
|
* ```typescript
|
|
11
|
-
* import { StreamingUtils,
|
|
12
|
+
* import { StreamingUtils, Muxer } from 'node-av/api';
|
|
12
13
|
*
|
|
13
14
|
* // Create RTP outputs
|
|
14
|
-
* const videoOutput = await
|
|
15
|
-
* const audioOutput = await
|
|
15
|
+
* const videoOutput = await Muxer.open('rtp://127.0.0.1:5004');
|
|
16
|
+
* const audioOutput = await Muxer.open('rtp://127.0.0.1:5006');
|
|
16
17
|
*
|
|
17
18
|
* // Generate SDP for streaming
|
|
18
19
|
* const sdp = StreamingUtils.createSdp([videoOutput, audioOutput]);
|
|
@@ -24,23 +25,24 @@ import type { MediaOutput } from '../media-output.js';
|
|
|
24
25
|
*/
|
|
25
26
|
export declare class StreamingUtils {
|
|
26
27
|
/**
|
|
27
|
-
* Create an SDP (Session Description Protocol) string from
|
|
28
|
+
* Create an SDP (Session Description Protocol) string from demuxer/muxer
|
|
28
29
|
*
|
|
29
30
|
* Generates an SDP description for RTP/RTSP streaming from one or more
|
|
30
|
-
* configured
|
|
31
|
+
* configured demuxer/muxer. The inputs/outputs should be configured with RTP
|
|
31
32
|
* format and have their streams set up before calling this method.
|
|
32
33
|
*
|
|
33
|
-
* @param
|
|
34
|
+
* @param contexts - Alternatively, array of FormatContext objects
|
|
35
|
+
*
|
|
34
36
|
* @returns SDP string if successful, null if failed
|
|
35
37
|
*
|
|
36
38
|
* @example
|
|
37
39
|
* ```typescript
|
|
38
40
|
* // Set up RTP outputs with streams
|
|
39
|
-
* const output1 = await
|
|
40
|
-
* await output1.
|
|
41
|
+
* const output1 = await Muxer.open('rtp://239.0.0.1:5004');
|
|
42
|
+
* await output1.addStream(encoder1);
|
|
41
43
|
*
|
|
42
|
-
* const output2 = await
|
|
43
|
-
* await output2.
|
|
44
|
+
* const output2 = await Muxer.open('rtp://239.0.0.1:5006');
|
|
45
|
+
* await output2.addStream(encoder2);
|
|
44
46
|
*
|
|
45
47
|
* // Generate SDP for multicast streaming
|
|
46
48
|
* const sdp = StreamingUtils.createSdp([output1.getFormatContext(), output2.getFormatContext()]);
|
|
@@ -51,29 +53,91 @@ export declare class StreamingUtils {
|
|
|
51
53
|
* ```
|
|
52
54
|
*/
|
|
53
55
|
static createSdp(contexts: FormatContext[]): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Generate SDP for RTP/SRTP input using FFmpeg's native SDP generator
|
|
58
|
+
*
|
|
59
|
+
* Creates an RFC-compliant SDP description using FFmpeg's internal logic.
|
|
60
|
+
* This ensures correct codec names, clock rates, and formatting for all codecs.
|
|
61
|
+
*
|
|
62
|
+
* @param configs - Array of stream configurations
|
|
63
|
+
*
|
|
64
|
+
* @param sessionName - Optional session name for the SDP (default: 'RTP Stream')
|
|
65
|
+
*
|
|
66
|
+
* @returns SDP string with proper rtpmap and optional crypto attributes
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* import { StreamingUtils } from 'node-av/api';
|
|
71
|
+
* import { AV_CODEC_ID_OPUS, AV_CODEC_ID_H264 } from 'node-av/constants';
|
|
72
|
+
*
|
|
73
|
+
* // Single audio stream with SRTP
|
|
74
|
+
* const sdp = StreamingUtils.createInputSDP([{
|
|
75
|
+
* port: 5004,
|
|
76
|
+
* codecId: AV_CODEC_ID_OPUS,
|
|
77
|
+
* payloadType: 111,
|
|
78
|
+
* clockRate: 48000,
|
|
79
|
+
* channels: 2,
|
|
80
|
+
* srtp: {
|
|
81
|
+
* key: Buffer.alloc(16, 0x12),
|
|
82
|
+
* salt: Buffer.alloc(14, 0x34)
|
|
83
|
+
* }
|
|
84
|
+
* }]);
|
|
85
|
+
*
|
|
86
|
+
* // Multi-stream (video + audio)
|
|
87
|
+
* const sdp = StreamingUtils.createInputSDP([
|
|
88
|
+
* { port: 5006, codecId: AV_CODEC_ID_H264, payloadType: 96, clockRate: 90000 },
|
|
89
|
+
* { port: 5004, codecId: AV_CODEC_ID_OPUS, payloadType: 111, clockRate: 48000, channels: 2 }
|
|
90
|
+
* ], 'My Stream');
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
static createInputSDP(configs: {
|
|
94
|
+
port: number;
|
|
95
|
+
codecId: AVCodecID;
|
|
96
|
+
payloadType: number;
|
|
97
|
+
clockRate: number;
|
|
98
|
+
channels?: number;
|
|
99
|
+
fmtp?: string;
|
|
100
|
+
srtp?: {
|
|
101
|
+
key: Buffer;
|
|
102
|
+
salt: Buffer;
|
|
103
|
+
suite?: 'AES_CM_128_HMAC_SHA1_80' | 'AES_CM_256_HMAC_SHA1_80';
|
|
104
|
+
};
|
|
105
|
+
}[], sessionName?: string): string;
|
|
54
106
|
/**
|
|
55
107
|
* Validate if an output is configured for RTP streaming
|
|
56
108
|
*
|
|
57
|
-
* @param output -
|
|
109
|
+
* @param output - Muxer to check
|
|
110
|
+
*
|
|
58
111
|
* @returns true if configured for RTP
|
|
59
112
|
*
|
|
60
113
|
* @example
|
|
61
114
|
* ```typescript
|
|
62
|
-
* const output = await
|
|
115
|
+
* const output = await Muxer.open('rtp://127.0.0.1:5004');
|
|
63
116
|
* if (StreamingUtils.isRtpOutput(output)) {
|
|
64
117
|
* const sdp = StreamingUtils.createSdpForOutput(output);
|
|
65
118
|
* }
|
|
66
119
|
* ```
|
|
67
120
|
*/
|
|
68
|
-
static isRtpOutput(output:
|
|
121
|
+
static isRtpOutput(output: Muxer): boolean;
|
|
69
122
|
/**
|
|
70
123
|
* Build RTP URL from components
|
|
71
124
|
*
|
|
72
125
|
* Helper to construct RTP URLs with proper formatting.
|
|
73
126
|
*
|
|
74
127
|
* @param host - IP address or hostname
|
|
128
|
+
*
|
|
75
129
|
* @param port - Port number
|
|
130
|
+
*
|
|
76
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
|
+
*
|
|
77
141
|
* @returns Formatted RTP URL
|
|
78
142
|
*
|
|
79
143
|
* @example
|
|
@@ -93,4 +157,30 @@ export declare class StreamingUtils {
|
|
|
93
157
|
localrtcpport?: number;
|
|
94
158
|
pkt_size?: number;
|
|
95
159
|
}): string;
|
|
160
|
+
/**
|
|
161
|
+
* Extract all UDP ports from SDP content
|
|
162
|
+
*
|
|
163
|
+
* @param sdp - SDP content string
|
|
164
|
+
*
|
|
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
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
static extractPortsFromSDP(sdp: string): number[];
|
|
96
186
|
}
|