node-av 3.1.3 → 4.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 +65 -52
- package/binding.gyp +4 -0
- 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 +319 -78
- package/dist/api/bitstream-filter.js +680 -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 +279 -17
- package/dist/api/decoder.js +998 -209
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/{media-input.d.ts → demuxer.d.ts} +294 -44
- package/dist/api/demuxer.js +1968 -0
- package/dist/api/demuxer.js.map +1 -0
- package/dist/api/encoder.d.ts +308 -50
- package/dist/api/encoder.js +1133 -111
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-presets.d.ts +12 -5
- package/dist/api/filter-presets.js +21 -7
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +406 -40
- package/dist/api/filter.js +966 -139
- 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 +6 -4
- package/dist/api/index.js +14 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +3 -3
- 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} +274 -60
- 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 +435 -425
- 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 +476 -55
- 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 +1 -1
- package/dist/api/utilities/image.d.ts +1 -1
- package/dist/api/utilities/index.d.ts +2 -0
- package/dist/api/utilities/index.js +4 -0
- package/dist/api/utilities/index.js.map +1 -1
- package/dist/api/utilities/media-type.d.ts +1 -1
- package/dist/api/utilities/pixel-format.d.ts +1 -1
- package/dist/api/utilities/sample-format.d.ts +1 -1
- package/dist/api/utilities/scheduler.d.ts +169 -0
- package/dist/api/utilities/scheduler.js +136 -0
- package/dist/api/utilities/scheduler.js.map +1 -0
- package/dist/api/utilities/streaming.d.ts +74 -15
- package/dist/api/utilities/streaming.js +170 -12
- package/dist/api/utilities/streaming.js.map +1 -1
- package/dist/api/utilities/timestamp.d.ts +1 -1
- 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/constants/constants.d.ts +51 -1
- package/dist/constants/constants.js +47 -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/lib/binding.d.ts +19 -8
- 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 +183 -1
- package/dist/lib/codec-parameters.js +209 -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/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 +168 -0
- package/dist/lib/frame.js +212 -0
- 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 +1 -0
- package/dist/lib/index.js +2 -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 +48 -26
- 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/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 +27 -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/package.json +20 -19
- 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
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { AudioFifo } from '../lib/audio-fifo.js';
|
|
2
|
+
import { Frame } from '../lib/frame.js';
|
|
3
|
+
/**
|
|
4
|
+
* Audio frame buffering utility for encoders with fixed frame size requirements.
|
|
5
|
+
*
|
|
6
|
+
* Many audio encoders (Opus, AAC, MP3, etc.) require frames with a specific number
|
|
7
|
+
* of samples (frame_size). This class buffers incoming frames and outputs frames
|
|
8
|
+
* with exactly the required size.
|
|
9
|
+
*
|
|
10
|
+
* Uses FFmpeg's AVAudioFifo internally for efficient sample buffering.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { AudioFrameBuffer } from 'node-av/api';
|
|
15
|
+
*
|
|
16
|
+
* // Create buffer for 480-sample frames (e.g., Opus at 24kHz)
|
|
17
|
+
* using buffer = AudioFrameBuffer.create(480, AV_SAMPLE_FMT_FLT, 48000, 'mono', 1);
|
|
18
|
+
*
|
|
19
|
+
* // Push variable-sized frames from filter
|
|
20
|
+
* for await (const frame of filterOutput) {
|
|
21
|
+
* await buffer.push(frame);
|
|
22
|
+
*
|
|
23
|
+
* // Pull fixed-size frames for encoder
|
|
24
|
+
* let outputFrame;
|
|
25
|
+
* while ((outputFrame = await buffer.pull()) !== null) {
|
|
26
|
+
* await encoder.encode(outputFrame);
|
|
27
|
+
* outputFrame.free();
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* // Flush remaining samples
|
|
32
|
+
* let outputFrame;
|
|
33
|
+
* while ((outputFrame = await buffer.pull()) !== null) {
|
|
34
|
+
* await encoder.encode(outputFrame);
|
|
35
|
+
* outputFrame.free();
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export class AudioFrameBuffer {
|
|
40
|
+
fifo;
|
|
41
|
+
frame;
|
|
42
|
+
frameSize;
|
|
43
|
+
nextPts = 0n;
|
|
44
|
+
firstFramePts = null;
|
|
45
|
+
/**
|
|
46
|
+
* @param fifo - Underlying AudioFifo instance
|
|
47
|
+
*
|
|
48
|
+
* @param frameSize - Number of samples per output frame
|
|
49
|
+
*
|
|
50
|
+
* @param sampleFormat - Audio sample format
|
|
51
|
+
*
|
|
52
|
+
* @param sampleRate - Sample rate in Hz
|
|
53
|
+
*
|
|
54
|
+
* @param channelLayout - Channel layout
|
|
55
|
+
*
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
constructor(fifo, frameSize, sampleFormat, sampleRate, channelLayout) {
|
|
59
|
+
this.fifo = fifo;
|
|
60
|
+
this.frameSize = frameSize;
|
|
61
|
+
this.frame = new Frame();
|
|
62
|
+
this.frame.alloc();
|
|
63
|
+
this.frame.nbSamples = frameSize;
|
|
64
|
+
this.frame.format = sampleFormat;
|
|
65
|
+
this.frame.sampleRate = sampleRate;
|
|
66
|
+
this.frame.channelLayout = channelLayout;
|
|
67
|
+
this.frame.getBuffer(0); // Allocate buffer once
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create an audio frame buffer.
|
|
71
|
+
*
|
|
72
|
+
* @param frameSize - Required frame size in samples
|
|
73
|
+
*
|
|
74
|
+
* @param sampleFormat - Audio sample format
|
|
75
|
+
*
|
|
76
|
+
* @param sampleRate - Sample rate in Hz
|
|
77
|
+
*
|
|
78
|
+
* @param channelLayout - Channel layout (e.g., 'mono', 'stereo')
|
|
79
|
+
*
|
|
80
|
+
* @param channels - Number of audio channels
|
|
81
|
+
*
|
|
82
|
+
* @returns Configured audio frame buffer
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* // For Opus encoder at 48kHz with 20ms frames
|
|
87
|
+
* const buffer = AudioFrameBuffer.create(960, AV_SAMPLE_FMT_FLT, 48000, 'mono', 1);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
static create(frameSize, sampleFormat, sampleRate, channelLayout, channels) {
|
|
91
|
+
const fifo = new AudioFifo();
|
|
92
|
+
// Allocate FIFO with capacity for multiple frames
|
|
93
|
+
fifo.alloc(sampleFormat, channels, frameSize * 4);
|
|
94
|
+
return new AudioFrameBuffer(fifo, frameSize, sampleFormat, sampleRate, channelLayout);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get number of samples currently in buffer.
|
|
98
|
+
*
|
|
99
|
+
* @returns Number of buffered samples
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* console.log(`Buffer contains ${buffer.size} samples`);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
get size() {
|
|
107
|
+
return this.fifo.size;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a complete frame is available.
|
|
111
|
+
*
|
|
112
|
+
* Returns true if the FIFO contains at least frameSize samples.
|
|
113
|
+
*
|
|
114
|
+
* @returns True if a full frame can be pulled
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* while (buffer.hasFrame()) {
|
|
119
|
+
* const frame = buffer.pull();
|
|
120
|
+
* // Process frame...
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
hasFrame() {
|
|
125
|
+
return this.fifo.size >= this.frameSize;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Push an audio frame into the buffer asynchronously.
|
|
129
|
+
*
|
|
130
|
+
* The frame's samples are added to the internal FIFO.
|
|
131
|
+
* Call hasFrame() and pull() to retrieve fixed-size output frames.
|
|
132
|
+
*
|
|
133
|
+
* @param frame - Audio frame to buffer
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* await buffer.push(filterFrame);
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @see {@link pushSync} For synchronous version
|
|
141
|
+
*/
|
|
142
|
+
async push(frame) {
|
|
143
|
+
if (!frame.isAudio()) {
|
|
144
|
+
throw new Error('AudioFrameBuffer.push() requires an audio frame');
|
|
145
|
+
}
|
|
146
|
+
if (this.firstFramePts === null) {
|
|
147
|
+
// Always start PTS from 0 for encoder frames
|
|
148
|
+
// Input frames may be in different timebase than encoder expects
|
|
149
|
+
this.firstFramePts = 0n;
|
|
150
|
+
this.nextPts = 0n;
|
|
151
|
+
}
|
|
152
|
+
// Write frame data to FIFO
|
|
153
|
+
await this.fifo.write(frame.data, frame.nbSamples);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Push an audio frame into the buffer synchronously.
|
|
157
|
+
* Synchronous version of push.
|
|
158
|
+
*
|
|
159
|
+
* The frame's samples are added to the internal FIFO.
|
|
160
|
+
* Call hasFrame() and pullSync() to retrieve fixed-size output frames.
|
|
161
|
+
*
|
|
162
|
+
* @param frame - Audio frame to buffer
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```typescript
|
|
166
|
+
* buffer.pushSync(filterFrame);
|
|
167
|
+
* ```
|
|
168
|
+
*
|
|
169
|
+
* @see {@link push} For async version
|
|
170
|
+
*/
|
|
171
|
+
pushSync(frame) {
|
|
172
|
+
if (!frame.isAudio()) {
|
|
173
|
+
throw new Error('AudioFrameBuffer.pushSync() requires an audio frame');
|
|
174
|
+
}
|
|
175
|
+
if (this.firstFramePts === null) {
|
|
176
|
+
// Always start PTS from 0 for encoder frames
|
|
177
|
+
// Input frames may be in different timebase than encoder expects
|
|
178
|
+
this.firstFramePts = 0n;
|
|
179
|
+
this.nextPts = 0n;
|
|
180
|
+
}
|
|
181
|
+
// Write frame data to FIFO
|
|
182
|
+
this.fifo.writeSync(frame.data, frame.nbSamples);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Pull a fixed-size audio frame from the buffer asynchronously.
|
|
186
|
+
*
|
|
187
|
+
* Reads exactly frameSize samples from the FIFO and returns a cloned Frame.
|
|
188
|
+
* Returns null if not enough samples are available.
|
|
189
|
+
* Reuses internal frame buffer for efficiency (like Decoder does).
|
|
190
|
+
*
|
|
191
|
+
* @returns Audio frame with exactly frameSize samples, or null if insufficient samples
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* using frame = await buffer.pull();
|
|
196
|
+
* if (frame) {
|
|
197
|
+
* await encoder.encode(frame);
|
|
198
|
+
* }
|
|
199
|
+
* ```
|
|
200
|
+
*
|
|
201
|
+
* @see {@link pullSync} For synchronous version
|
|
202
|
+
*/
|
|
203
|
+
async pull() {
|
|
204
|
+
if (!this.hasFrame()) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
// Update PTS
|
|
208
|
+
this.frame.pts = this.nextPts;
|
|
209
|
+
// Read samples from FIFO into reusable frame
|
|
210
|
+
await this.fifo.read(this.frame.data, this.frameSize);
|
|
211
|
+
// Update PTS for next frame
|
|
212
|
+
this.nextPts += BigInt(this.frameSize);
|
|
213
|
+
// Clone frame for user (like Decoder does)
|
|
214
|
+
return this.frame.clone();
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Pull a fixed-size audio frame from the buffer synchronously.
|
|
218
|
+
* Synchronous version of pull.
|
|
219
|
+
*
|
|
220
|
+
* Reads exactly frameSize samples from the FIFO and returns a cloned Frame.
|
|
221
|
+
* Returns null if not enough samples are available.
|
|
222
|
+
* Reuses internal frame buffer for efficiency (like Decoder does).
|
|
223
|
+
*
|
|
224
|
+
* @returns Audio frame with exactly frameSize samples, or null if insufficient samples
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```typescript
|
|
228
|
+
* using frame = buffer.pullSync();
|
|
229
|
+
* if (frame) {
|
|
230
|
+
* encoder.encodeSync(frame);
|
|
231
|
+
* }
|
|
232
|
+
* ```
|
|
233
|
+
*
|
|
234
|
+
* @see {@link pull} For async version
|
|
235
|
+
*/
|
|
236
|
+
pullSync() {
|
|
237
|
+
if (!this.hasFrame()) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
// Update PTS
|
|
241
|
+
this.frame.pts = this.nextPts;
|
|
242
|
+
// Read samples from FIFO into reusable frame
|
|
243
|
+
this.fifo.readSync(this.frame.data, this.frameSize);
|
|
244
|
+
// Update PTS for next frame
|
|
245
|
+
this.nextPts += BigInt(this.frameSize);
|
|
246
|
+
// Clone frame for user (like Decoder does)
|
|
247
|
+
return this.frame.clone();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Reset the buffer, discarding all buffered samples.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* buffer.reset();
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
reset() {
|
|
258
|
+
this.fifo.reset();
|
|
259
|
+
this.nextPts = 0n;
|
|
260
|
+
this.firstFramePts = null;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Free the buffer and all resources.
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```typescript
|
|
267
|
+
* buffer.free();
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
[Symbol.dispose]() {
|
|
271
|
+
this.frame.free();
|
|
272
|
+
this.fifo[Symbol.dispose]();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=audio-frame-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-frame-buffer.js","sourceRoot":"","sources":["../../src/api/audio-frame-buffer.ts"],"names":[],"mappings":"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"}
|