node-av 1.1.0 → 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 +51 -38
- package/dist/api/bitstream-filter.d.ts +180 -123
- package/dist/api/bitstream-filter.js +180 -125
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +279 -132
- package/dist/api/decoder.js +285 -142
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/encoder.d.ts +246 -162
- package/dist/api/encoder.js +272 -208
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-presets.d.ts +690 -94
- package/dist/api/filter-presets.js +686 -102
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +249 -213
- package/dist/api/filter.js +252 -242
- package/dist/api/filter.js.map +1 -1
- package/dist/api/hardware.d.ts +224 -117
- package/dist/api/hardware.js +380 -214
- package/dist/api/hardware.js.map +1 -1
- package/dist/api/index.d.ts +3 -3
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +65 -61
- package/dist/api/io-stream.js +43 -46
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/media-input.d.ts +242 -140
- package/dist/api/media-input.js +205 -103
- package/dist/api/media-input.js.map +1 -1
- package/dist/api/media-output.d.ts +206 -128
- package/dist/api/media-output.js +210 -128
- 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 +21 -187
- 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/audio-fifo.d.ts +127 -170
- package/dist/lib/audio-fifo.js +130 -173
- package/dist/lib/audio-fifo.js.map +1 -1
- 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 +68 -54
- package/dist/lib/bitstream-filter.js +68 -54
- package/dist/lib/bitstream-filter.js.map +1 -1
- package/dist/lib/codec-context.d.ts +316 -380
- package/dist/lib/codec-context.js +316 -381
- package/dist/lib/codec-context.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +160 -170
- package/dist/lib/codec-parameters.js +162 -172
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/codec-parser.d.ts +91 -104
- package/dist/lib/codec-parser.js +92 -103
- package/dist/lib/codec-parser.js.map +1 -1
- package/dist/lib/codec.d.ts +264 -281
- package/dist/lib/codec.js +268 -285
- package/dist/lib/codec.js.map +1 -1
- package/dist/lib/dictionary.d.ts +149 -203
- package/dist/lib/dictionary.js +158 -212
- package/dist/lib/dictionary.js.map +1 -1
- package/dist/lib/error.d.ts +96 -130
- package/dist/lib/error.js +98 -128
- package/dist/lib/error.js.map +1 -1
- package/dist/lib/filter-context.d.ts +284 -218
- package/dist/lib/filter-context.js +290 -227
- package/dist/lib/filter-context.js.map +1 -1
- package/dist/lib/filter-graph.d.ts +251 -292
- 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 +93 -111
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/format-context.d.ts +320 -428
- package/dist/lib/format-context.js +313 -385
- package/dist/lib/format-context.js.map +1 -1
- package/dist/lib/frame.d.ts +262 -405
- package/dist/lib/frame.js +263 -408
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/hardware-device-context.d.ts +149 -203
- 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 +170 -180
- 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 -1
- package/dist/lib/index.js +2 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/input-format.d.ts +89 -117
- package/dist/lib/input-format.js +89 -117
- package/dist/lib/input-format.js.map +1 -1
- package/dist/lib/io-context.d.ts +209 -241
- package/dist/lib/io-context.js +220 -252
- package/dist/lib/io-context.js.map +1 -1
- package/dist/lib/log.d.ts +85 -119
- package/dist/lib/log.js +85 -122
- package/dist/lib/log.js.map +1 -1
- package/dist/lib/native-types.d.ts +117 -106
- package/dist/lib/native-types.js +0 -7
- package/dist/lib/native-types.js.map +1 -1
- package/dist/lib/option.d.ts +284 -241
- package/dist/lib/option.js +309 -249
- package/dist/lib/option.js.map +1 -1
- package/dist/lib/output-format.d.ts +77 -101
- package/dist/lib/output-format.js +77 -101
- package/dist/lib/output-format.js.map +1 -1
- package/dist/lib/packet.d.ts +172 -240
- 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 +241 -325
- 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 +129 -173
- package/dist/lib/software-scale-context.js +131 -175
- package/dist/lib/software-scale-context.js.map +1 -1
- package/dist/lib/stream.d.ts +87 -197
- package/dist/lib/stream.js +87 -197
- package/dist/lib/stream.js.map +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 +21 -12
- package/release_notes.md +43 -59
- package/CHANGELOG.md +0 -8
package/dist/api/media-input.js
CHANGED
|
@@ -1,87 +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
3
|
import { AVFLAG_NONE, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_VIDEO } from '../constants/constants.js';
|
|
15
4
|
import { avGetPixFmtName, avGetSampleFmtName, Dictionary, FFmpegError, FormatContext, InputFormat, Packet, Rational } from '../lib/index.js';
|
|
16
5
|
import { IOStream } from './io-stream.js';
|
|
17
6
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* Opens and provides access to media streams from various sources.
|
|
21
|
-
* Automatically detects format and finds stream information.
|
|
7
|
+
* High-level media input for reading and demuxing media files.
|
|
22
8
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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.
|
|
25
13
|
*
|
|
26
14
|
* @example
|
|
27
15
|
* ```typescript
|
|
28
16
|
* import { MediaInput } from 'node-av/api';
|
|
29
17
|
*
|
|
30
|
-
* // Open
|
|
31
|
-
*
|
|
32
|
-
* console.log(`
|
|
33
|
-
* 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`);
|
|
34
22
|
*
|
|
35
|
-
* //
|
|
36
|
-
* const
|
|
37
|
-
* const media = await MediaInput.open(buffer);
|
|
38
|
-
*
|
|
39
|
-
* // Iterate packets
|
|
40
|
-
* for await (const packet of media.packets()) {
|
|
23
|
+
* // Process packets
|
|
24
|
+
* for await (const packet of input.packets()) {
|
|
41
25
|
* console.log(`Packet from stream ${packet.streamIndex}`);
|
|
26
|
+
* packet.free();
|
|
42
27
|
* }
|
|
43
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
|
|
44
44
|
*/
|
|
45
45
|
export class MediaInput {
|
|
46
46
|
formatContext;
|
|
47
47
|
_streams = [];
|
|
48
|
-
ioContext;
|
|
48
|
+
ioContext;
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* Private constructor - use MediaInput.open() to create instances.
|
|
53
|
-
*
|
|
54
|
-
* Parses stream information immediately after construction.
|
|
55
|
-
*
|
|
56
|
-
* @param formatContext - Opened FormatContext
|
|
50
|
+
* @param formatContext - Opened format context
|
|
51
|
+
* @internal
|
|
57
52
|
*/
|
|
58
53
|
constructor(formatContext) {
|
|
59
54
|
this.formatContext = formatContext;
|
|
60
|
-
// Streams will be set after findStreamInfo in the static factory
|
|
61
55
|
}
|
|
62
56
|
/**
|
|
63
|
-
* Probe
|
|
57
|
+
* Probe media format without fully opening the file.
|
|
64
58
|
*
|
|
65
|
-
* Detects
|
|
66
|
-
*
|
|
59
|
+
* Detects format by analyzing file headers and content.
|
|
60
|
+
* Useful for format validation before processing.
|
|
67
61
|
*
|
|
68
|
-
*
|
|
62
|
+
* Direct mapping to av_probe_input_format().
|
|
69
63
|
*
|
|
64
|
+
* @param input - File path or buffer to probe
|
|
70
65
|
* @returns Format information or null if unrecognized
|
|
71
66
|
*
|
|
72
67
|
* @example
|
|
73
68
|
* ```typescript
|
|
74
|
-
* // Probe a file
|
|
75
69
|
* const info = await MediaInput.probeFormat('video.mp4');
|
|
76
70
|
* if (info) {
|
|
77
71
|
* console.log(`Format: ${info.format}`);
|
|
78
72
|
* console.log(`Confidence: ${info.confidence}%`);
|
|
79
73
|
* }
|
|
74
|
+
* ```
|
|
80
75
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Probe from buffer
|
|
79
|
+
* const buffer = await fs.readFile('video.webm');
|
|
83
80
|
* const info = await MediaInput.probeFormat(buffer);
|
|
81
|
+
* console.log(`MIME type: ${info?.mimeType}`);
|
|
84
82
|
* ```
|
|
83
|
+
*
|
|
84
|
+
* @see {@link InputFormat.probe} For low-level probing
|
|
85
85
|
*/
|
|
86
86
|
static async probeFormat(input) {
|
|
87
87
|
try {
|
|
@@ -237,9 +237,14 @@ export class MediaInput {
|
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
/**
|
|
240
|
-
* Get all streams in the
|
|
240
|
+
* Get all streams in the media.
|
|
241
241
|
*
|
|
242
|
-
* @
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* for (const stream of input.streams) {
|
|
245
|
+
* console.log(`Stream ${stream.index}: ${stream.codecpar.codecType}`);
|
|
246
|
+
* }
|
|
247
|
+
* ```
|
|
243
248
|
*/
|
|
244
249
|
get streams() {
|
|
245
250
|
return this._streams;
|
|
@@ -247,9 +252,12 @@ export class MediaInput {
|
|
|
247
252
|
/**
|
|
248
253
|
* Get media duration in seconds.
|
|
249
254
|
*
|
|
250
|
-
* Returns 0 if duration is not available.
|
|
255
|
+
* Returns 0 if duration is unknown or not available.
|
|
251
256
|
*
|
|
252
|
-
* @
|
|
257
|
+
* @example
|
|
258
|
+
* ```typescript
|
|
259
|
+
* console.log(`Duration: ${input.duration} seconds`);
|
|
260
|
+
* ```
|
|
253
261
|
*/
|
|
254
262
|
get duration() {
|
|
255
263
|
const duration = this.formatContext.duration;
|
|
@@ -259,76 +267,114 @@ export class MediaInput {
|
|
|
259
267
|
return Number(duration) / 1000000;
|
|
260
268
|
}
|
|
261
269
|
/**
|
|
262
|
-
* Get
|
|
270
|
+
* Get media bitrate in kilobits per second.
|
|
263
271
|
*
|
|
264
|
-
* Returns 0 if bitrate is
|
|
272
|
+
* Returns 0 if bitrate is unknown.
|
|
265
273
|
*
|
|
266
|
-
* @
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* console.log(`Bitrate: ${input.bitRate} kbps`);
|
|
277
|
+
* ```
|
|
267
278
|
*/
|
|
268
279
|
get bitRate() {
|
|
269
280
|
const bitrate = this.formatContext.bitRate;
|
|
270
281
|
if (!bitrate || bitrate <= 0)
|
|
271
282
|
return 0;
|
|
272
|
-
// Convert from
|
|
283
|
+
// Convert from bits per second to kilobits per second
|
|
273
284
|
return Number(bitrate) / 1000;
|
|
274
285
|
}
|
|
275
286
|
/**
|
|
276
|
-
* Get
|
|
287
|
+
* Get media metadata.
|
|
288
|
+
*
|
|
289
|
+
* Returns all metadata tags as key-value pairs.
|
|
277
290
|
*
|
|
278
|
-
* @
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* const metadata = input.metadata;
|
|
294
|
+
* console.log(`Title: ${metadata.title}`);
|
|
295
|
+
* console.log(`Artist: ${metadata.artist}`);
|
|
296
|
+
* ```
|
|
279
297
|
*/
|
|
280
298
|
get metadata() {
|
|
281
299
|
return this.formatContext.metadata?.getAll() ?? {};
|
|
282
300
|
}
|
|
283
301
|
/**
|
|
284
|
-
* Get
|
|
302
|
+
* Get format name.
|
|
285
303
|
*
|
|
286
|
-
* @
|
|
304
|
+
* @example
|
|
305
|
+
* ```typescript
|
|
306
|
+
* console.log(`Format: ${input.formatName}`); // "mov,mp4,m4a,3gp,3g2,mj2"
|
|
307
|
+
* ```
|
|
287
308
|
*/
|
|
288
309
|
get formatName() {
|
|
289
310
|
return this.formatContext.iformat?.name ?? 'unknown';
|
|
290
311
|
}
|
|
291
312
|
/**
|
|
292
|
-
* Get
|
|
313
|
+
* Get format long name.
|
|
293
314
|
*
|
|
294
|
-
* @
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* console.log(`Format: ${input.formatLongName}`); // "QuickTime / MOV"
|
|
318
|
+
* ```
|
|
295
319
|
*/
|
|
296
320
|
get formatLongName() {
|
|
297
321
|
return this.formatContext.iformat?.longName ?? 'Unknown Format';
|
|
298
322
|
}
|
|
299
323
|
/**
|
|
300
|
-
* Get
|
|
324
|
+
* Get video stream by index.
|
|
301
325
|
*
|
|
302
|
-
*
|
|
326
|
+
* Returns the nth video stream (0-based index).
|
|
327
|
+
* Returns undefined if stream doesn't exist.
|
|
303
328
|
*
|
|
304
|
-
* @
|
|
329
|
+
* @param index - Video stream index (default: 0)
|
|
330
|
+
* @returns Video stream or undefined
|
|
305
331
|
*
|
|
306
332
|
* @example
|
|
307
333
|
* ```typescript
|
|
308
|
-
* const videoStream =
|
|
334
|
+
* const videoStream = input.video();
|
|
309
335
|
* if (videoStream) {
|
|
310
|
-
* console.log(`Video: ${videoStream.width}x${videoStream.height}`);
|
|
336
|
+
* console.log(`Video: ${videoStream.codecpar.width}x${videoStream.codecpar.height}`);
|
|
311
337
|
* }
|
|
312
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
|
|
313
348
|
*/
|
|
314
349
|
video(index = 0) {
|
|
315
350
|
const streams = this._streams.filter((s) => s.codecpar.codecType === AVMEDIA_TYPE_VIDEO);
|
|
316
351
|
return streams[index];
|
|
317
352
|
}
|
|
318
353
|
/**
|
|
319
|
-
* Get
|
|
354
|
+
* Get audio stream by index.
|
|
320
355
|
*
|
|
321
|
-
*
|
|
356
|
+
* Returns the nth audio stream (0-based index).
|
|
357
|
+
* Returns undefined if stream doesn't exist.
|
|
322
358
|
*
|
|
323
|
-
* @
|
|
359
|
+
* @param index - Audio stream index (default: 0)
|
|
360
|
+
* @returns Audio stream or undefined
|
|
324
361
|
*
|
|
325
362
|
* @example
|
|
326
363
|
* ```typescript
|
|
327
|
-
* const audioStream =
|
|
364
|
+
* const audioStream = input.audio();
|
|
328
365
|
* if (audioStream) {
|
|
329
|
-
* console.log(`Audio: ${audioStream.sampleRate}Hz
|
|
366
|
+
* console.log(`Audio: ${audioStream.codecpar.sampleRate}Hz`);
|
|
330
367
|
* }
|
|
331
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
|
|
332
378
|
*/
|
|
333
379
|
audio(index = 0) {
|
|
334
380
|
const streams = this._streams.filter((s) => s.codecpar.codecType === AVMEDIA_TYPE_AUDIO);
|
|
@@ -337,37 +383,64 @@ export class MediaInput {
|
|
|
337
383
|
/**
|
|
338
384
|
* Find the best stream of a given type.
|
|
339
385
|
*
|
|
340
|
-
* Uses FFmpeg's stream selection
|
|
386
|
+
* Uses FFmpeg's stream selection algorithm.
|
|
387
|
+
* Considers codec support, default flags, and quality.
|
|
341
388
|
*
|
|
342
|
-
*
|
|
389
|
+
* Direct mapping to av_find_best_stream().
|
|
343
390
|
*
|
|
344
|
-
* @param type - Media type to
|
|
391
|
+
* @param type - Media type to find
|
|
392
|
+
* @returns Best stream or undefined if not found
|
|
345
393
|
*
|
|
346
|
-
* @
|
|
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
|
|
347
406
|
*/
|
|
348
407
|
findBestStream(type) {
|
|
349
408
|
const bestStreamIndex = this.formatContext.findBestStream(type);
|
|
350
409
|
return this._streams.find((s) => s.index === bestStreamIndex);
|
|
351
410
|
}
|
|
352
411
|
/**
|
|
353
|
-
*
|
|
412
|
+
* Read packets from media as async generator.
|
|
354
413
|
*
|
|
355
|
-
*
|
|
356
|
-
* Automatically
|
|
414
|
+
* Yields demuxed packets for processing.
|
|
415
|
+
* Automatically handles packet memory management.
|
|
416
|
+
* Optionally filters packets by stream index.
|
|
357
417
|
*
|
|
358
|
-
*
|
|
418
|
+
* Direct mapping to av_read_frame().
|
|
359
419
|
*
|
|
360
|
-
* @
|
|
420
|
+
* @param index - Optional stream index to filter
|
|
421
|
+
* @yields Demuxed packets (must be freed by caller)
|
|
422
|
+
* @throws {Error} If packet cloning fails
|
|
361
423
|
*
|
|
362
424
|
* @example
|
|
363
425
|
* ```typescript
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* }
|
|
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();
|
|
369
430
|
* }
|
|
370
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
|
|
371
444
|
*/
|
|
372
445
|
async *packets(index) {
|
|
373
446
|
const packet = new Packet();
|
|
@@ -401,17 +474,34 @@ export class MediaInput {
|
|
|
401
474
|
}
|
|
402
475
|
}
|
|
403
476
|
/**
|
|
404
|
-
* 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
|
|
405
488
|
*
|
|
406
|
-
*
|
|
489
|
+
* @example
|
|
490
|
+
* ```typescript
|
|
491
|
+
* // Seek to 30 seconds
|
|
492
|
+
* const ret = await input.seek(30);
|
|
493
|
+
* FFmpegError.throwIfError(ret, 'seek failed');
|
|
494
|
+
* ```
|
|
407
495
|
*
|
|
408
|
-
*
|
|
496
|
+
* @example
|
|
497
|
+
* ```typescript
|
|
498
|
+
* import { AVSEEK_FLAG_BACKWARD } from 'node-av/constants';
|
|
409
499
|
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
*
|
|
500
|
+
* // Seek to keyframe before 60 seconds
|
|
501
|
+
* await input.seek(60, -1, AVSEEK_FLAG_BACKWARD);
|
|
502
|
+
* ```
|
|
413
503
|
*
|
|
414
|
-
* @
|
|
504
|
+
* @see {@link AVSeekFlag} For seek flags
|
|
415
505
|
*/
|
|
416
506
|
async seek(timestamp, streamIndex = -1, flags = AVFLAG_NONE) {
|
|
417
507
|
// Convert seconds to AV_TIME_BASE
|
|
@@ -419,12 +509,25 @@ export class MediaInput {
|
|
|
419
509
|
return this.formatContext.seekFrame(streamIndex, ts, flags);
|
|
420
510
|
}
|
|
421
511
|
/**
|
|
422
|
-
* 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().
|
|
423
519
|
*
|
|
424
|
-
*
|
|
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
|
+
* ```
|
|
425
529
|
*
|
|
426
|
-
*
|
|
427
|
-
* use-after-free errors.
|
|
530
|
+
* @see {@link Symbol.asyncDispose} For automatic cleanup
|
|
428
531
|
*/
|
|
429
532
|
async close() {
|
|
430
533
|
// IMPORTANT: Clear pb reference FIRST to prevent use-after-free
|
|
@@ -440,13 +543,11 @@ export class MediaInput {
|
|
|
440
543
|
}
|
|
441
544
|
}
|
|
442
545
|
/**
|
|
443
|
-
* Get
|
|
444
|
-
*
|
|
445
|
-
* Internal method for advanced use cases.
|
|
546
|
+
* Get underlying format context.
|
|
446
547
|
*
|
|
447
|
-
*
|
|
548
|
+
* Returns the internal format context for advanced operations.
|
|
448
549
|
*
|
|
449
|
-
* @returns
|
|
550
|
+
* @returns Format context
|
|
450
551
|
*
|
|
451
552
|
* @internal
|
|
452
553
|
*/
|
|
@@ -454,19 +555,20 @@ export class MediaInput {
|
|
|
454
555
|
return this.formatContext;
|
|
455
556
|
}
|
|
456
557
|
/**
|
|
457
|
-
*
|
|
558
|
+
* Dispose of media input.
|
|
458
559
|
*
|
|
459
|
-
* Implements
|
|
460
|
-
*
|
|
461
|
-
* Calls close() to free all resources.
|
|
560
|
+
* Implements AsyncDisposable interface for automatic cleanup.
|
|
561
|
+
* Equivalent to calling close().
|
|
462
562
|
*
|
|
463
563
|
* @example
|
|
464
564
|
* ```typescript
|
|
465
565
|
* {
|
|
466
|
-
* await using
|
|
467
|
-
* //
|
|
566
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
567
|
+
* // Process media...
|
|
468
568
|
* } // Automatically closed
|
|
469
569
|
* ```
|
|
570
|
+
*
|
|
571
|
+
* @see {@link close} For manual cleanup
|
|
470
572
|
*/
|
|
471
573
|
async [Symbol.asyncDispose]() {
|
|
472
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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"}
|