node-av 1.0.3 → 1.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 +56 -41
- package/dist/api/bitstream-filter.d.ts +180 -123
- package/dist/api/bitstream-filter.js +182 -126
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +286 -130
- package/dist/api/decoder.js +321 -159
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/encoder.d.ts +254 -158
- package/dist/api/encoder.js +326 -298
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-presets.d.ts +912 -0
- package/dist/api/filter-presets.js +1407 -0
- package/dist/api/filter-presets.js.map +1 -0
- package/dist/api/filter.d.ts +280 -284
- package/dist/api/filter.js +435 -509
- package/dist/api/filter.js.map +1 -1
- package/dist/api/hardware.d.ts +226 -159
- package/dist/api/hardware.js +405 -287
- package/dist/api/hardware.js.map +1 -1
- package/dist/api/index.d.ts +3 -2
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +65 -61
- package/dist/api/io-stream.js +45 -47
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/media-input.d.ts +244 -141
- package/dist/api/media-input.js +207 -104
- package/dist/api/media-input.js.map +1 -1
- package/dist/api/media-output.d.ts +206 -128
- package/dist/api/media-output.js +212 -129
- package/dist/api/media-output.js.map +1 -1
- package/dist/api/pipeline.d.ts +168 -38
- package/dist/api/pipeline.js +238 -14
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/types.d.ts +22 -182
- package/dist/api/utilities/audio-sample.d.ts +1 -1
- package/dist/api/utilities/image.d.ts +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/timestamp.d.ts +1 -1
- package/dist/api/utils.d.ts +1 -2
- package/dist/api/utils.js +9 -0
- package/dist/api/utils.js.map +1 -1
- package/dist/{lib → constants}/channel-layouts.d.ts +1 -1
- package/dist/constants/channel-layouts.js.map +1 -0
- package/dist/{lib → constants}/constants.d.ts +19 -4
- package/dist/{lib → constants}/constants.js +15 -1
- package/dist/constants/constants.js.map +1 -0
- package/dist/constants/decoders.d.ts +609 -0
- package/dist/constants/decoders.js +617 -0
- package/dist/constants/decoders.js.map +1 -0
- package/dist/constants/encoders.d.ts +285 -0
- package/dist/constants/encoders.js +298 -0
- package/dist/constants/encoders.js.map +1 -0
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.js +5 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/audio-fifo.d.ts +128 -171
- package/dist/lib/audio-fifo.js +130 -173
- package/dist/lib/audio-fifo.js.map +1 -1
- package/dist/lib/binding.d.ts +7 -5
- package/dist/lib/binding.js +5 -0
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/bitstream-filter-context.d.ts +139 -184
- package/dist/lib/bitstream-filter-context.js +139 -188
- package/dist/lib/bitstream-filter-context.js.map +1 -1
- package/dist/lib/bitstream-filter.d.ts +69 -55
- package/dist/lib/bitstream-filter.js +68 -54
- package/dist/lib/bitstream-filter.js.map +1 -1
- package/dist/lib/codec-context.d.ts +317 -381
- package/dist/lib/codec-context.js +316 -381
- package/dist/lib/codec-context.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +161 -171
- package/dist/lib/codec-parameters.js +162 -172
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/codec-parser.d.ts +92 -105
- package/dist/lib/codec-parser.js +92 -103
- package/dist/lib/codec-parser.js.map +1 -1
- package/dist/lib/codec.d.ts +328 -217
- package/dist/lib/codec.js +392 -218
- package/dist/lib/codec.js.map +1 -1
- package/dist/lib/dictionary.d.ts +150 -204
- package/dist/lib/dictionary.js +159 -213
- package/dist/lib/dictionary.js.map +1 -1
- package/dist/lib/error.d.ts +97 -131
- package/dist/lib/error.js +98 -128
- package/dist/lib/error.js.map +1 -1
- package/dist/lib/filter-context.d.ts +317 -194
- package/dist/lib/filter-context.js +335 -200
- package/dist/lib/filter-context.js.map +1 -1
- package/dist/lib/filter-graph.d.ts +252 -293
- package/dist/lib/filter-graph.js +253 -294
- package/dist/lib/filter-graph.js.map +1 -1
- package/dist/lib/filter-inout.d.ts +87 -95
- package/dist/lib/filter-inout.js +87 -95
- package/dist/lib/filter-inout.js.map +1 -1
- package/dist/lib/filter.d.ts +93 -111
- package/dist/lib/filter.js +94 -112
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/format-context.d.ts +321 -429
- package/dist/lib/format-context.js +314 -386
- package/dist/lib/format-context.js.map +1 -1
- package/dist/lib/frame.d.ts +263 -406
- package/dist/lib/frame.js +263 -408
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/hardware-device-context.d.ts +150 -204
- package/dist/lib/hardware-device-context.js +149 -203
- package/dist/lib/hardware-device-context.js.map +1 -1
- package/dist/lib/hardware-frames-context.d.ts +171 -181
- package/dist/lib/hardware-frames-context.js +171 -181
- package/dist/lib/hardware-frames-context.js.map +1 -1
- package/dist/lib/index.d.ts +2 -3
- package/dist/lib/index.js +2 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/input-format.d.ts +90 -118
- package/dist/lib/input-format.js +89 -117
- package/dist/lib/input-format.js.map +1 -1
- package/dist/lib/io-context.d.ts +210 -242
- package/dist/lib/io-context.js +221 -253
- package/dist/lib/io-context.js.map +1 -1
- package/dist/lib/log.d.ts +86 -120
- package/dist/lib/log.js +85 -122
- package/dist/lib/log.js.map +1 -1
- package/dist/lib/native-types.d.ts +127 -112
- package/dist/lib/native-types.js +9 -0
- package/dist/lib/native-types.js.map +1 -1
- package/dist/lib/option.d.ts +285 -242
- package/dist/lib/option.js +310 -250
- package/dist/lib/option.js.map +1 -1
- package/dist/lib/output-format.d.ts +78 -102
- package/dist/lib/output-format.js +77 -101
- package/dist/lib/output-format.js.map +1 -1
- package/dist/lib/packet.d.ts +173 -241
- package/dist/lib/packet.js +172 -241
- package/dist/lib/packet.js.map +1 -1
- package/dist/lib/rational.d.ts +0 -2
- package/dist/lib/rational.js +0 -2
- package/dist/lib/rational.js.map +1 -1
- package/dist/lib/software-resample-context.d.ts +242 -326
- package/dist/lib/software-resample-context.js +242 -326
- package/dist/lib/software-resample-context.js.map +1 -1
- package/dist/lib/software-scale-context.d.ts +130 -174
- package/dist/lib/software-scale-context.js +132 -176
- package/dist/lib/software-scale-context.js.map +1 -1
- package/dist/lib/stream.d.ts +88 -198
- package/dist/lib/stream.js +87 -197
- package/dist/lib/stream.js.map +1 -1
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/utilities.d.ts +372 -181
- package/dist/lib/utilities.js +373 -182
- package/dist/lib/utilities.js.map +1 -1
- package/install/check.js +0 -1
- package/package.json +32 -24
- package/release_notes.md +43 -13
- package/CHANGELOG.md +0 -8
- package/dist/lib/channel-layouts.js.map +0 -1
- package/dist/lib/constants.js.map +0 -1
- /package/dist/{lib → constants}/channel-layouts.js +0 -0
package/dist/api/media-input.js
CHANGED
|
@@ -1,86 +1,87 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MediaInput - Unified Input Handler for FFmpeg
|
|
3
|
-
*
|
|
4
|
-
* Provides a high-level interface for opening and reading media from various sources.
|
|
5
|
-
* Supports files, URLs, and Buffers with automatic format detection.
|
|
6
|
-
*
|
|
7
|
-
* Central entry point for all media input operations.
|
|
8
|
-
* Manages FormatContext lifecycle and provides stream information.
|
|
9
|
-
*
|
|
10
|
-
* @module api/media-input
|
|
11
|
-
*/
|
|
12
1
|
import { open } from 'fs/promises';
|
|
13
2
|
import { resolve } from 'path';
|
|
14
|
-
import { AVFLAG_NONE,
|
|
3
|
+
import { AVFLAG_NONE, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_VIDEO } from '../constants/constants.js';
|
|
4
|
+
import { avGetPixFmtName, avGetSampleFmtName, Dictionary, FFmpegError, FormatContext, InputFormat, Packet, Rational } from '../lib/index.js';
|
|
15
5
|
import { IOStream } from './io-stream.js';
|
|
16
6
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Opens and provides access to media streams from various sources.
|
|
20
|
-
* Automatically detects format and finds stream information.
|
|
7
|
+
* High-level media input for reading and demuxing media files.
|
|
21
8
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
9
|
+
* Provides simplified access to media streams, packets, and metadata.
|
|
10
|
+
* Handles file opening, format detection, and stream information extraction.
|
|
11
|
+
* Supports files, URLs, buffers, and raw data input with automatic cleanup.
|
|
12
|
+
* Essential component for media processing pipelines and transcoding.
|
|
24
13
|
*
|
|
25
14
|
* @example
|
|
26
15
|
* ```typescript
|
|
27
16
|
* import { MediaInput } from 'node-av/api';
|
|
28
17
|
*
|
|
29
|
-
* // Open
|
|
30
|
-
*
|
|
31
|
-
* console.log(`
|
|
32
|
-
* console.log(`Duration: ${
|
|
18
|
+
* // Open media file
|
|
19
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
20
|
+
* console.log(`Format: ${input.formatName}`);
|
|
21
|
+
* console.log(`Duration: ${input.duration}s`);
|
|
33
22
|
*
|
|
34
|
-
* //
|
|
35
|
-
* const
|
|
36
|
-
* const media = await MediaInput.open(buffer);
|
|
37
|
-
*
|
|
38
|
-
* // Iterate packets
|
|
39
|
-
* for await (const packet of media.packets()) {
|
|
23
|
+
* // Process packets
|
|
24
|
+
* for await (const packet of input.packets()) {
|
|
40
25
|
* console.log(`Packet from stream ${packet.streamIndex}`);
|
|
26
|
+
* packet.free();
|
|
41
27
|
* }
|
|
42
28
|
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // From buffer
|
|
33
|
+
* const buffer = await fs.readFile('video.mp4');
|
|
34
|
+
* await using input = await MediaInput.open(buffer);
|
|
35
|
+
*
|
|
36
|
+
* // Access streams
|
|
37
|
+
* const videoStream = input.video();
|
|
38
|
+
* const audioStream = input.audio();
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @see {@link MediaOutput} For writing media files
|
|
42
|
+
* @see {@link Decoder} For decoding packets to frames
|
|
43
|
+
* @see {@link FormatContext} For low-level API
|
|
43
44
|
*/
|
|
44
45
|
export class MediaInput {
|
|
45
46
|
formatContext;
|
|
46
47
|
_streams = [];
|
|
47
|
-
ioContext;
|
|
48
|
+
ioContext;
|
|
48
49
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* Private constructor - use MediaInput.open() to create instances.
|
|
52
|
-
*
|
|
53
|
-
* Parses stream information immediately after construction.
|
|
54
|
-
*
|
|
55
|
-
* @param formatContext - Opened FormatContext
|
|
50
|
+
* @param formatContext - Opened format context
|
|
51
|
+
* @internal
|
|
56
52
|
*/
|
|
57
53
|
constructor(formatContext) {
|
|
58
54
|
this.formatContext = formatContext;
|
|
59
|
-
// Streams will be set after findStreamInfo in the static factory
|
|
60
55
|
}
|
|
61
56
|
/**
|
|
62
|
-
* Probe
|
|
57
|
+
* Probe media format without fully opening the file.
|
|
63
58
|
*
|
|
64
|
-
* Detects
|
|
65
|
-
*
|
|
59
|
+
* Detects format by analyzing file headers and content.
|
|
60
|
+
* Useful for format validation before processing.
|
|
66
61
|
*
|
|
67
|
-
*
|
|
62
|
+
* Direct mapping to av_probe_input_format().
|
|
68
63
|
*
|
|
64
|
+
* @param input - File path or buffer to probe
|
|
69
65
|
* @returns Format information or null if unrecognized
|
|
70
66
|
*
|
|
71
67
|
* @example
|
|
72
68
|
* ```typescript
|
|
73
|
-
* // Probe a file
|
|
74
69
|
* const info = await MediaInput.probeFormat('video.mp4');
|
|
75
70
|
* if (info) {
|
|
76
71
|
* console.log(`Format: ${info.format}`);
|
|
77
72
|
* console.log(`Confidence: ${info.confidence}%`);
|
|
78
73
|
* }
|
|
74
|
+
* ```
|
|
79
75
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Probe from buffer
|
|
79
|
+
* const buffer = await fs.readFile('video.webm');
|
|
82
80
|
* const info = await MediaInput.probeFormat(buffer);
|
|
81
|
+
* console.log(`MIME type: ${info?.mimeType}`);
|
|
83
82
|
* ```
|
|
83
|
+
*
|
|
84
|
+
* @see {@link InputFormat.probe} For low-level probing
|
|
84
85
|
*/
|
|
85
86
|
static async probeFormat(input) {
|
|
86
87
|
try {
|
|
@@ -236,9 +237,14 @@ export class MediaInput {
|
|
|
236
237
|
}
|
|
237
238
|
}
|
|
238
239
|
/**
|
|
239
|
-
* Get all streams in the
|
|
240
|
+
* Get all streams in the media.
|
|
240
241
|
*
|
|
241
|
-
* @
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* for (const stream of input.streams) {
|
|
245
|
+
* console.log(`Stream ${stream.index}: ${stream.codecpar.codecType}`);
|
|
246
|
+
* }
|
|
247
|
+
* ```
|
|
242
248
|
*/
|
|
243
249
|
get streams() {
|
|
244
250
|
return this._streams;
|
|
@@ -246,9 +252,12 @@ export class MediaInput {
|
|
|
246
252
|
/**
|
|
247
253
|
* Get media duration in seconds.
|
|
248
254
|
*
|
|
249
|
-
* Returns 0 if duration is not available.
|
|
255
|
+
* Returns 0 if duration is unknown or not available.
|
|
250
256
|
*
|
|
251
|
-
* @
|
|
257
|
+
* @example
|
|
258
|
+
* ```typescript
|
|
259
|
+
* console.log(`Duration: ${input.duration} seconds`);
|
|
260
|
+
* ```
|
|
252
261
|
*/
|
|
253
262
|
get duration() {
|
|
254
263
|
const duration = this.formatContext.duration;
|
|
@@ -258,76 +267,114 @@ export class MediaInput {
|
|
|
258
267
|
return Number(duration) / 1000000;
|
|
259
268
|
}
|
|
260
269
|
/**
|
|
261
|
-
* Get
|
|
270
|
+
* Get media bitrate in kilobits per second.
|
|
262
271
|
*
|
|
263
|
-
* Returns 0 if bitrate is
|
|
272
|
+
* Returns 0 if bitrate is unknown.
|
|
264
273
|
*
|
|
265
|
-
* @
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* console.log(`Bitrate: ${input.bitRate} kbps`);
|
|
277
|
+
* ```
|
|
266
278
|
*/
|
|
267
279
|
get bitRate() {
|
|
268
280
|
const bitrate = this.formatContext.bitRate;
|
|
269
281
|
if (!bitrate || bitrate <= 0)
|
|
270
282
|
return 0;
|
|
271
|
-
// Convert from
|
|
283
|
+
// Convert from bits per second to kilobits per second
|
|
272
284
|
return Number(bitrate) / 1000;
|
|
273
285
|
}
|
|
274
286
|
/**
|
|
275
|
-
* Get
|
|
287
|
+
* Get media metadata.
|
|
288
|
+
*
|
|
289
|
+
* Returns all metadata tags as key-value pairs.
|
|
276
290
|
*
|
|
277
|
-
* @
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* const metadata = input.metadata;
|
|
294
|
+
* console.log(`Title: ${metadata.title}`);
|
|
295
|
+
* console.log(`Artist: ${metadata.artist}`);
|
|
296
|
+
* ```
|
|
278
297
|
*/
|
|
279
298
|
get metadata() {
|
|
280
299
|
return this.formatContext.metadata?.getAll() ?? {};
|
|
281
300
|
}
|
|
282
301
|
/**
|
|
283
|
-
* Get
|
|
302
|
+
* Get format name.
|
|
284
303
|
*
|
|
285
|
-
* @
|
|
304
|
+
* @example
|
|
305
|
+
* ```typescript
|
|
306
|
+
* console.log(`Format: ${input.formatName}`); // "mov,mp4,m4a,3gp,3g2,mj2"
|
|
307
|
+
* ```
|
|
286
308
|
*/
|
|
287
309
|
get formatName() {
|
|
288
310
|
return this.formatContext.iformat?.name ?? 'unknown';
|
|
289
311
|
}
|
|
290
312
|
/**
|
|
291
|
-
* Get
|
|
313
|
+
* Get format long name.
|
|
292
314
|
*
|
|
293
|
-
* @
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* console.log(`Format: ${input.formatLongName}`); // "QuickTime / MOV"
|
|
318
|
+
* ```
|
|
294
319
|
*/
|
|
295
320
|
get formatLongName() {
|
|
296
321
|
return this.formatContext.iformat?.longName ?? 'Unknown Format';
|
|
297
322
|
}
|
|
298
323
|
/**
|
|
299
|
-
* Get
|
|
324
|
+
* Get video stream by index.
|
|
300
325
|
*
|
|
301
|
-
*
|
|
326
|
+
* Returns the nth video stream (0-based index).
|
|
327
|
+
* Returns undefined if stream doesn't exist.
|
|
302
328
|
*
|
|
303
|
-
* @
|
|
329
|
+
* @param index - Video stream index (default: 0)
|
|
330
|
+
* @returns Video stream or undefined
|
|
304
331
|
*
|
|
305
332
|
* @example
|
|
306
333
|
* ```typescript
|
|
307
|
-
* const videoStream =
|
|
334
|
+
* const videoStream = input.video();
|
|
308
335
|
* if (videoStream) {
|
|
309
|
-
* console.log(`Video: ${videoStream.width}x${videoStream.height}`);
|
|
336
|
+
* console.log(`Video: ${videoStream.codecpar.width}x${videoStream.codecpar.height}`);
|
|
310
337
|
* }
|
|
311
338
|
* ```
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* ```typescript
|
|
342
|
+
* // Get second video stream
|
|
343
|
+
* const secondVideo = input.video(1);
|
|
344
|
+
* ```
|
|
345
|
+
*
|
|
346
|
+
* @see {@link audio} For audio streams
|
|
347
|
+
* @see {@link findBestStream} For automatic selection
|
|
312
348
|
*/
|
|
313
349
|
video(index = 0) {
|
|
314
350
|
const streams = this._streams.filter((s) => s.codecpar.codecType === AVMEDIA_TYPE_VIDEO);
|
|
315
351
|
return streams[index];
|
|
316
352
|
}
|
|
317
353
|
/**
|
|
318
|
-
* Get
|
|
354
|
+
* Get audio stream by index.
|
|
319
355
|
*
|
|
320
|
-
*
|
|
356
|
+
* Returns the nth audio stream (0-based index).
|
|
357
|
+
* Returns undefined if stream doesn't exist.
|
|
321
358
|
*
|
|
322
|
-
* @
|
|
359
|
+
* @param index - Audio stream index (default: 0)
|
|
360
|
+
* @returns Audio stream or undefined
|
|
323
361
|
*
|
|
324
362
|
* @example
|
|
325
363
|
* ```typescript
|
|
326
|
-
* const audioStream =
|
|
364
|
+
* const audioStream = input.audio();
|
|
327
365
|
* if (audioStream) {
|
|
328
|
-
* console.log(`Audio: ${audioStream.sampleRate}Hz
|
|
366
|
+
* console.log(`Audio: ${audioStream.codecpar.sampleRate}Hz`);
|
|
329
367
|
* }
|
|
330
368
|
* ```
|
|
369
|
+
*
|
|
370
|
+
* @example
|
|
371
|
+
* ```typescript
|
|
372
|
+
* // Get second audio stream
|
|
373
|
+
* const secondAudio = input.audio(1);
|
|
374
|
+
* ```
|
|
375
|
+
*
|
|
376
|
+
* @see {@link video} For video streams
|
|
377
|
+
* @see {@link findBestStream} For automatic selection
|
|
331
378
|
*/
|
|
332
379
|
audio(index = 0) {
|
|
333
380
|
const streams = this._streams.filter((s) => s.codecpar.codecType === AVMEDIA_TYPE_AUDIO);
|
|
@@ -336,37 +383,64 @@ export class MediaInput {
|
|
|
336
383
|
/**
|
|
337
384
|
* Find the best stream of a given type.
|
|
338
385
|
*
|
|
339
|
-
* Uses FFmpeg's stream selection
|
|
386
|
+
* Uses FFmpeg's stream selection algorithm.
|
|
387
|
+
* Considers codec support, default flags, and quality.
|
|
340
388
|
*
|
|
341
|
-
*
|
|
389
|
+
* Direct mapping to av_find_best_stream().
|
|
342
390
|
*
|
|
343
|
-
* @param type - Media type to
|
|
391
|
+
* @param type - Media type to find
|
|
392
|
+
* @returns Best stream or undefined if not found
|
|
344
393
|
*
|
|
345
|
-
* @
|
|
394
|
+
* @example
|
|
395
|
+
* ```typescript
|
|
396
|
+
* import { AVMEDIA_TYPE_VIDEO } from 'node-av/constants';
|
|
397
|
+
*
|
|
398
|
+
* const bestVideo = input.findBestStream(AVMEDIA_TYPE_VIDEO);
|
|
399
|
+
* if (bestVideo) {
|
|
400
|
+
* const decoder = await Decoder.create(bestVideo);
|
|
401
|
+
* }
|
|
402
|
+
* ```
|
|
403
|
+
*
|
|
404
|
+
* @see {@link video} For direct video stream access
|
|
405
|
+
* @see {@link audio} For direct audio stream access
|
|
346
406
|
*/
|
|
347
407
|
findBestStream(type) {
|
|
348
408
|
const bestStreamIndex = this.formatContext.findBestStream(type);
|
|
349
409
|
return this._streams.find((s) => s.index === bestStreamIndex);
|
|
350
410
|
}
|
|
351
411
|
/**
|
|
352
|
-
*
|
|
412
|
+
* Read packets from media as async generator.
|
|
353
413
|
*
|
|
354
|
-
*
|
|
355
|
-
* Automatically
|
|
414
|
+
* Yields demuxed packets for processing.
|
|
415
|
+
* Automatically handles packet memory management.
|
|
416
|
+
* Optionally filters packets by stream index.
|
|
356
417
|
*
|
|
357
|
-
*
|
|
418
|
+
* Direct mapping to av_read_frame().
|
|
358
419
|
*
|
|
359
|
-
* @
|
|
420
|
+
* @param index - Optional stream index to filter
|
|
421
|
+
* @yields Demuxed packets (must be freed by caller)
|
|
422
|
+
* @throws {Error} If packet cloning fails
|
|
360
423
|
*
|
|
361
424
|
* @example
|
|
362
425
|
* ```typescript
|
|
363
|
-
*
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
* }
|
|
426
|
+
* // Read all packets
|
|
427
|
+
* for await (const packet of input.packets()) {
|
|
428
|
+
* console.log(`Packet: stream=${packet.streamIndex}, pts=${packet.pts}`);
|
|
429
|
+
* packet.free();
|
|
368
430
|
* }
|
|
369
431
|
* ```
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* // Read only video packets
|
|
436
|
+
* const videoStream = input.video();
|
|
437
|
+
* for await (const packet of input.packets(videoStream.index)) {
|
|
438
|
+
* // Process video packet
|
|
439
|
+
* packet.free();
|
|
440
|
+
* }
|
|
441
|
+
* ```
|
|
442
|
+
*
|
|
443
|
+
* @see {@link Decoder.frames} For decoding packets
|
|
370
444
|
*/
|
|
371
445
|
async *packets(index) {
|
|
372
446
|
const packet = new Packet();
|
|
@@ -400,17 +474,34 @@ export class MediaInput {
|
|
|
400
474
|
}
|
|
401
475
|
}
|
|
402
476
|
/**
|
|
403
|
-
* Seek to
|
|
477
|
+
* Seek to timestamp in media.
|
|
478
|
+
*
|
|
479
|
+
* Seeks to the specified position in seconds.
|
|
480
|
+
* Can seek in specific stream or globally.
|
|
481
|
+
*
|
|
482
|
+
* Direct mapping to av_seek_frame().
|
|
483
|
+
*
|
|
484
|
+
* @param timestamp - Target position in seconds
|
|
485
|
+
* @param streamIndex - Stream index or -1 for global (default: -1)
|
|
486
|
+
* @param flags - Seek flags (default: AVFLAG_NONE)
|
|
487
|
+
* @returns 0 on success, negative on error
|
|
404
488
|
*
|
|
405
|
-
*
|
|
489
|
+
* @example
|
|
490
|
+
* ```typescript
|
|
491
|
+
* // Seek to 30 seconds
|
|
492
|
+
* const ret = await input.seek(30);
|
|
493
|
+
* FFmpegError.throwIfError(ret, 'seek failed');
|
|
494
|
+
* ```
|
|
406
495
|
*
|
|
407
|
-
*
|
|
496
|
+
* @example
|
|
497
|
+
* ```typescript
|
|
498
|
+
* import { AVSEEK_FLAG_BACKWARD } from 'node-av/constants';
|
|
408
499
|
*
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
500
|
+
* // Seek to keyframe before 60 seconds
|
|
501
|
+
* await input.seek(60, -1, AVSEEK_FLAG_BACKWARD);
|
|
502
|
+
* ```
|
|
412
503
|
*
|
|
413
|
-
* @
|
|
504
|
+
* @see {@link AVSeekFlag} For seek flags
|
|
414
505
|
*/
|
|
415
506
|
async seek(timestamp, streamIndex = -1, flags = AVFLAG_NONE) {
|
|
416
507
|
// Convert seconds to AV_TIME_BASE
|
|
@@ -418,12 +509,25 @@ export class MediaInput {
|
|
|
418
509
|
return this.formatContext.seekFrame(streamIndex, ts, flags);
|
|
419
510
|
}
|
|
420
511
|
/**
|
|
421
|
-
* Close
|
|
512
|
+
* Close media input and free resources.
|
|
513
|
+
*
|
|
514
|
+
* Releases format context and I/O context.
|
|
515
|
+
* Safe to call multiple times.
|
|
516
|
+
* Automatically called by Symbol.asyncDispose.
|
|
517
|
+
*
|
|
518
|
+
* Direct mapping to avformat_close_input().
|
|
422
519
|
*
|
|
423
|
-
*
|
|
520
|
+
* @example
|
|
521
|
+
* ```typescript
|
|
522
|
+
* const input = await MediaInput.open('video.mp4');
|
|
523
|
+
* try {
|
|
524
|
+
* // Use input
|
|
525
|
+
* } finally {
|
|
526
|
+
* await input.close();
|
|
527
|
+
* }
|
|
528
|
+
* ```
|
|
424
529
|
*
|
|
425
|
-
*
|
|
426
|
-
* use-after-free errors.
|
|
530
|
+
* @see {@link Symbol.asyncDispose} For automatic cleanup
|
|
427
531
|
*/
|
|
428
532
|
async close() {
|
|
429
533
|
// IMPORTANT: Clear pb reference FIRST to prevent use-after-free
|
|
@@ -439,13 +543,11 @@ export class MediaInput {
|
|
|
439
543
|
}
|
|
440
544
|
}
|
|
441
545
|
/**
|
|
442
|
-
* Get
|
|
443
|
-
*
|
|
444
|
-
* Internal method for advanced use cases.
|
|
546
|
+
* Get underlying format context.
|
|
445
547
|
*
|
|
446
|
-
*
|
|
548
|
+
* Returns the internal format context for advanced operations.
|
|
447
549
|
*
|
|
448
|
-
* @returns
|
|
550
|
+
* @returns Format context
|
|
449
551
|
*
|
|
450
552
|
* @internal
|
|
451
553
|
*/
|
|
@@ -453,19 +555,20 @@ export class MediaInput {
|
|
|
453
555
|
return this.formatContext;
|
|
454
556
|
}
|
|
455
557
|
/**
|
|
456
|
-
*
|
|
558
|
+
* Dispose of media input.
|
|
457
559
|
*
|
|
458
|
-
* Implements
|
|
459
|
-
*
|
|
460
|
-
* Calls close() to free all resources.
|
|
560
|
+
* Implements AsyncDisposable interface for automatic cleanup.
|
|
561
|
+
* Equivalent to calling close().
|
|
461
562
|
*
|
|
462
563
|
* @example
|
|
463
564
|
* ```typescript
|
|
464
565
|
* {
|
|
465
|
-
* await using
|
|
466
|
-
* //
|
|
566
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
567
|
+
* // Process media...
|
|
467
568
|
* } // Automatically closed
|
|
468
569
|
* ```
|
|
570
|
+
*
|
|
571
|
+
* @see {@link close} For manual cleanup
|
|
469
572
|
*/
|
|
470
573
|
async [Symbol.asyncDispose]() {
|
|
471
574
|
await this.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-input.js","sourceRoot":"","sources":["../../src/api/media-input.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"media-input.js","sourceRoot":"","sources":["../../src/api/media-input.ts"],"names":[],"mappings":"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"}
|