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
|
@@ -1,83 +1,84 @@
|
|
|
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 { FormatContext, Packet } from '../lib/index.js';
|
|
13
2
|
import type { AVMediaType, AVSeekFlag } from '../constants/constants.js';
|
|
14
3
|
import type { Stream } from '../lib/index.js';
|
|
15
4
|
import type { MediaInputOptions, RawData } from './types.js';
|
|
16
5
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Opens and provides access to media streams from various sources.
|
|
20
|
-
* Automatically detects format and finds stream information.
|
|
6
|
+
* High-level media input for reading and demuxing media files.
|
|
21
7
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
8
|
+
* Provides simplified access to media streams, packets, and metadata.
|
|
9
|
+
* Handles file opening, format detection, and stream information extraction.
|
|
10
|
+
* Supports files, URLs, buffers, and raw data input with automatic cleanup.
|
|
11
|
+
* Essential component for media processing pipelines and transcoding.
|
|
24
12
|
*
|
|
25
13
|
* @example
|
|
26
14
|
* ```typescript
|
|
27
15
|
* import { MediaInput } from 'node-av/api';
|
|
28
16
|
*
|
|
29
|
-
* // Open
|
|
30
|
-
*
|
|
31
|
-
* console.log(`
|
|
32
|
-
* console.log(`Duration: ${
|
|
17
|
+
* // Open media file
|
|
18
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
19
|
+
* console.log(`Format: ${input.formatName}`);
|
|
20
|
+
* console.log(`Duration: ${input.duration}s`);
|
|
33
21
|
*
|
|
34
|
-
* //
|
|
35
|
-
* const
|
|
36
|
-
* const media = await MediaInput.open(buffer);
|
|
37
|
-
*
|
|
38
|
-
* // Iterate packets
|
|
39
|
-
* for await (const packet of media.packets()) {
|
|
22
|
+
* // Process packets
|
|
23
|
+
* for await (const packet of input.packets()) {
|
|
40
24
|
* console.log(`Packet from stream ${packet.streamIndex}`);
|
|
25
|
+
* packet.free();
|
|
41
26
|
* }
|
|
42
27
|
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // From buffer
|
|
32
|
+
* const buffer = await fs.readFile('video.mp4');
|
|
33
|
+
* await using input = await MediaInput.open(buffer);
|
|
34
|
+
*
|
|
35
|
+
* // Access streams
|
|
36
|
+
* const videoStream = input.video();
|
|
37
|
+
* const audioStream = input.audio();
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @see {@link MediaOutput} For writing media files
|
|
41
|
+
* @see {@link Decoder} For decoding packets to frames
|
|
42
|
+
* @see {@link FormatContext} For low-level API
|
|
43
43
|
*/
|
|
44
44
|
export declare class MediaInput implements AsyncDisposable {
|
|
45
45
|
private formatContext;
|
|
46
46
|
private _streams;
|
|
47
47
|
private ioContext?;
|
|
48
48
|
/**
|
|
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
|
|
49
|
+
* @param formatContext - Opened format context
|
|
50
|
+
* @internal
|
|
56
51
|
*/
|
|
57
52
|
private constructor();
|
|
58
53
|
/**
|
|
59
|
-
* Probe
|
|
54
|
+
* Probe media format without fully opening the file.
|
|
60
55
|
*
|
|
61
|
-
* Detects
|
|
62
|
-
*
|
|
56
|
+
* Detects format by analyzing file headers and content.
|
|
57
|
+
* Useful for format validation before processing.
|
|
63
58
|
*
|
|
64
|
-
*
|
|
59
|
+
* Direct mapping to av_probe_input_format().
|
|
65
60
|
*
|
|
61
|
+
* @param input - File path or buffer to probe
|
|
66
62
|
* @returns Format information or null if unrecognized
|
|
67
63
|
*
|
|
68
64
|
* @example
|
|
69
65
|
* ```typescript
|
|
70
|
-
* // Probe a file
|
|
71
66
|
* const info = await MediaInput.probeFormat('video.mp4');
|
|
72
67
|
* if (info) {
|
|
73
68
|
* console.log(`Format: ${info.format}`);
|
|
74
69
|
* console.log(`Confidence: ${info.confidence}%`);
|
|
75
70
|
* }
|
|
71
|
+
* ```
|
|
76
72
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // Probe from buffer
|
|
76
|
+
* const buffer = await fs.readFile('video.webm');
|
|
79
77
|
* const info = await MediaInput.probeFormat(buffer);
|
|
78
|
+
* console.log(`MIME type: ${info?.mimeType}`);
|
|
80
79
|
* ```
|
|
80
|
+
*
|
|
81
|
+
* @see {@link InputFormat.probe} For low-level probing
|
|
81
82
|
*/
|
|
82
83
|
static probeFormat(input: string | Buffer): Promise<{
|
|
83
84
|
format: string;
|
|
@@ -87,218 +88,319 @@ export declare class MediaInput implements AsyncDisposable {
|
|
|
87
88
|
confidence: number;
|
|
88
89
|
} | null>;
|
|
89
90
|
/**
|
|
90
|
-
* Open
|
|
91
|
+
* Open media from file, URL, buffer, or raw data.
|
|
91
92
|
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
93
|
+
* Automatically detects format and extracts stream information.
|
|
94
|
+
* Supports various input sources with flexible configuration.
|
|
95
|
+
* Creates demuxer ready for packet extraction.
|
|
94
96
|
*
|
|
95
|
-
*
|
|
97
|
+
* Direct mapping to avformat_open_input() and avformat_find_stream_info().
|
|
96
98
|
*
|
|
97
|
-
* @param input - File path, URL, or
|
|
98
|
-
* @param options -
|
|
99
|
+
* @param input - File path, URL, buffer, or raw data descriptor
|
|
100
|
+
* @param options - Input configuration options
|
|
101
|
+
* @returns Opened media input instance
|
|
99
102
|
*
|
|
100
|
-
* @
|
|
101
|
-
*
|
|
102
|
-
* @throws {Error} If input cannot be opened or stream info not found
|
|
103
|
+
* @throws {Error} If format not found or open fails
|
|
104
|
+
* @throws {FFmpegError} If FFmpeg operations fail
|
|
103
105
|
*
|
|
104
106
|
* @example
|
|
105
107
|
* ```typescript
|
|
106
|
-
* //
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* // From URL
|
|
110
|
-
* const media = await MediaInput.open('https://example.com/video.mp4');
|
|
111
|
-
*
|
|
112
|
-
* // From Buffer
|
|
113
|
-
* const buffer = await fs.readFile('video.mp4');
|
|
114
|
-
* const media = await MediaInput.open(buffer);
|
|
108
|
+
* // Open file
|
|
109
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
115
110
|
* ```
|
|
116
|
-
*/
|
|
117
|
-
static open(input: string | Buffer, options?: MediaInputOptions): Promise<MediaInput>;
|
|
118
|
-
/**
|
|
119
|
-
* Open raw video or audio data.
|
|
120
|
-
*
|
|
121
|
-
* @param rawData - Raw video or audio configuration
|
|
122
111
|
*
|
|
123
|
-
* @
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // Open URL
|
|
115
|
+
* await using input = await MediaInput.open('http://example.com/stream.m3u8');
|
|
116
|
+
* ```
|
|
124
117
|
*
|
|
125
118
|
* @example
|
|
126
119
|
* ```typescript
|
|
127
|
-
* //
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* frameRate: 30
|
|
120
|
+
* // Open with options
|
|
121
|
+
* await using input = await MediaInput.open('rtsp://camera.local', {
|
|
122
|
+
* format: 'rtsp',
|
|
123
|
+
* options: {
|
|
124
|
+
* rtsp_transport: 'tcp',
|
|
125
|
+
* analyzeduration: '5000000'
|
|
126
|
+
* }
|
|
135
127
|
* });
|
|
128
|
+
* ```
|
|
136
129
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* // Open raw video data
|
|
133
|
+
* await using input = await MediaInput.open({
|
|
134
|
+
* type: 'video',
|
|
135
|
+
* input: rawBuffer,
|
|
136
|
+
* width: 1920,
|
|
137
|
+
* height: 1080,
|
|
138
|
+
* pixelFormat: AV_PIX_FMT_YUV420P,
|
|
139
|
+
* frameRate: { num: 30, den: 1 }
|
|
144
140
|
* });
|
|
145
141
|
* ```
|
|
142
|
+
*
|
|
143
|
+
* @see {@link MediaInputOptions} For configuration options
|
|
144
|
+
* @see {@link RawData} For raw data input
|
|
146
145
|
*/
|
|
146
|
+
static open(input: string | Buffer, options?: MediaInputOptions): Promise<MediaInput>;
|
|
147
147
|
static open(rawData: RawData, options?: MediaInputOptions): Promise<MediaInput>;
|
|
148
148
|
/**
|
|
149
|
-
* Get all streams in the
|
|
149
|
+
* Get all streams in the media.
|
|
150
150
|
*
|
|
151
|
-
* @
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* for (const stream of input.streams) {
|
|
154
|
+
* console.log(`Stream ${stream.index}: ${stream.codecpar.codecType}`);
|
|
155
|
+
* }
|
|
156
|
+
* ```
|
|
152
157
|
*/
|
|
153
158
|
get streams(): Stream[];
|
|
154
159
|
/**
|
|
155
160
|
* Get media duration in seconds.
|
|
156
161
|
*
|
|
157
|
-
* Returns 0 if duration is not available.
|
|
162
|
+
* Returns 0 if duration is unknown or not available.
|
|
158
163
|
*
|
|
159
|
-
* @
|
|
164
|
+
* @example
|
|
165
|
+
* ```typescript
|
|
166
|
+
* console.log(`Duration: ${input.duration} seconds`);
|
|
167
|
+
* ```
|
|
160
168
|
*/
|
|
161
169
|
get duration(): number;
|
|
162
170
|
/**
|
|
163
|
-
* Get
|
|
171
|
+
* Get media bitrate in kilobits per second.
|
|
164
172
|
*
|
|
165
|
-
* Returns 0 if bitrate is
|
|
173
|
+
* Returns 0 if bitrate is unknown.
|
|
166
174
|
*
|
|
167
|
-
* @
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* console.log(`Bitrate: ${input.bitRate} kbps`);
|
|
178
|
+
* ```
|
|
168
179
|
*/
|
|
169
180
|
get bitRate(): number;
|
|
170
181
|
/**
|
|
171
|
-
* Get
|
|
182
|
+
* Get media metadata.
|
|
172
183
|
*
|
|
173
|
-
*
|
|
184
|
+
* Returns all metadata tags as key-value pairs.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```typescript
|
|
188
|
+
* const metadata = input.metadata;
|
|
189
|
+
* console.log(`Title: ${metadata.title}`);
|
|
190
|
+
* console.log(`Artist: ${metadata.artist}`);
|
|
191
|
+
* ```
|
|
174
192
|
*/
|
|
175
193
|
get metadata(): Record<string, string>;
|
|
176
194
|
/**
|
|
177
|
-
* Get
|
|
195
|
+
* Get format name.
|
|
178
196
|
*
|
|
179
|
-
* @
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* console.log(`Format: ${input.formatName}`); // "mov,mp4,m4a,3gp,3g2,mj2"
|
|
200
|
+
* ```
|
|
180
201
|
*/
|
|
181
202
|
get formatName(): string;
|
|
182
203
|
/**
|
|
183
|
-
* Get
|
|
204
|
+
* Get format long name.
|
|
184
205
|
*
|
|
185
|
-
* @
|
|
206
|
+
* @example
|
|
207
|
+
* ```typescript
|
|
208
|
+
* console.log(`Format: ${input.formatLongName}`); // "QuickTime / MOV"
|
|
209
|
+
* ```
|
|
186
210
|
*/
|
|
187
211
|
get formatLongName(): string;
|
|
188
212
|
/**
|
|
189
|
-
* Get
|
|
213
|
+
* Get video stream by index.
|
|
190
214
|
*
|
|
191
|
-
*
|
|
215
|
+
* Returns the nth video stream (0-based index).
|
|
216
|
+
* Returns undefined if stream doesn't exist.
|
|
192
217
|
*
|
|
193
|
-
* @
|
|
218
|
+
* @param index - Video stream index (default: 0)
|
|
219
|
+
* @returns Video stream or undefined
|
|
194
220
|
*
|
|
195
221
|
* @example
|
|
196
222
|
* ```typescript
|
|
197
|
-
* const videoStream =
|
|
223
|
+
* const videoStream = input.video();
|
|
198
224
|
* if (videoStream) {
|
|
199
|
-
* console.log(`Video: ${videoStream.width}x${videoStream.height}`);
|
|
225
|
+
* console.log(`Video: ${videoStream.codecpar.width}x${videoStream.codecpar.height}`);
|
|
200
226
|
* }
|
|
201
227
|
* ```
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* // Get second video stream
|
|
232
|
+
* const secondVideo = input.video(1);
|
|
233
|
+
* ```
|
|
234
|
+
*
|
|
235
|
+
* @see {@link audio} For audio streams
|
|
236
|
+
* @see {@link findBestStream} For automatic selection
|
|
202
237
|
*/
|
|
203
238
|
video(index?: number): Stream | undefined;
|
|
204
239
|
/**
|
|
205
|
-
* Get
|
|
240
|
+
* Get audio stream by index.
|
|
206
241
|
*
|
|
207
|
-
*
|
|
242
|
+
* Returns the nth audio stream (0-based index).
|
|
243
|
+
* Returns undefined if stream doesn't exist.
|
|
208
244
|
*
|
|
209
|
-
* @
|
|
245
|
+
* @param index - Audio stream index (default: 0)
|
|
246
|
+
* @returns Audio stream or undefined
|
|
210
247
|
*
|
|
211
248
|
* @example
|
|
212
249
|
* ```typescript
|
|
213
|
-
* const audioStream =
|
|
250
|
+
* const audioStream = input.audio();
|
|
214
251
|
* if (audioStream) {
|
|
215
|
-
* console.log(`Audio: ${audioStream.sampleRate}Hz
|
|
252
|
+
* console.log(`Audio: ${audioStream.codecpar.sampleRate}Hz`);
|
|
216
253
|
* }
|
|
217
254
|
* ```
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* // Get second audio stream
|
|
259
|
+
* const secondAudio = input.audio(1);
|
|
260
|
+
* ```
|
|
261
|
+
*
|
|
262
|
+
* @see {@link video} For video streams
|
|
263
|
+
* @see {@link findBestStream} For automatic selection
|
|
218
264
|
*/
|
|
219
265
|
audio(index?: number): Stream | undefined;
|
|
220
266
|
/**
|
|
221
267
|
* Find the best stream of a given type.
|
|
222
268
|
*
|
|
223
|
-
* Uses FFmpeg's stream selection
|
|
269
|
+
* Uses FFmpeg's stream selection algorithm.
|
|
270
|
+
* Considers codec support, default flags, and quality.
|
|
224
271
|
*
|
|
225
|
-
*
|
|
272
|
+
* Direct mapping to av_find_best_stream().
|
|
226
273
|
*
|
|
227
|
-
* @param type - Media type to
|
|
274
|
+
* @param type - Media type to find
|
|
275
|
+
* @returns Best stream or undefined if not found
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* import { AVMEDIA_TYPE_VIDEO } from 'node-av/constants';
|
|
280
|
+
*
|
|
281
|
+
* const bestVideo = input.findBestStream(AVMEDIA_TYPE_VIDEO);
|
|
282
|
+
* if (bestVideo) {
|
|
283
|
+
* const decoder = await Decoder.create(bestVideo);
|
|
284
|
+
* }
|
|
285
|
+
* ```
|
|
228
286
|
*
|
|
229
|
-
* @
|
|
287
|
+
* @see {@link video} For direct video stream access
|
|
288
|
+
* @see {@link audio} For direct audio stream access
|
|
230
289
|
*/
|
|
231
290
|
findBestStream(type: AVMediaType): Stream | undefined;
|
|
232
291
|
/**
|
|
233
|
-
*
|
|
292
|
+
* Read packets from media as async generator.
|
|
234
293
|
*
|
|
235
|
-
*
|
|
236
|
-
* Automatically
|
|
294
|
+
* Yields demuxed packets for processing.
|
|
295
|
+
* Automatically handles packet memory management.
|
|
296
|
+
* Optionally filters packets by stream index.
|
|
237
297
|
*
|
|
238
|
-
*
|
|
298
|
+
* Direct mapping to av_read_frame().
|
|
239
299
|
*
|
|
240
|
-
* @
|
|
300
|
+
* @param index - Optional stream index to filter
|
|
301
|
+
* @yields Demuxed packets (must be freed by caller)
|
|
302
|
+
* @throws {Error} If packet cloning fails
|
|
241
303
|
*
|
|
242
304
|
* @example
|
|
243
305
|
* ```typescript
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
* }
|
|
306
|
+
* // Read all packets
|
|
307
|
+
* for await (const packet of input.packets()) {
|
|
308
|
+
* console.log(`Packet: stream=${packet.streamIndex}, pts=${packet.pts}`);
|
|
309
|
+
* packet.free();
|
|
249
310
|
* }
|
|
250
311
|
* ```
|
|
312
|
+
*
|
|
313
|
+
* @example
|
|
314
|
+
* ```typescript
|
|
315
|
+
* // Read only video packets
|
|
316
|
+
* const videoStream = input.video();
|
|
317
|
+
* for await (const packet of input.packets(videoStream.index)) {
|
|
318
|
+
* // Process video packet
|
|
319
|
+
* packet.free();
|
|
320
|
+
* }
|
|
321
|
+
* ```
|
|
322
|
+
*
|
|
323
|
+
* @see {@link Decoder.frames} For decoding packets
|
|
251
324
|
*/
|
|
252
325
|
packets(index?: number): AsyncGenerator<Packet>;
|
|
253
326
|
/**
|
|
254
|
-
* Seek to
|
|
327
|
+
* Seek to timestamp in media.
|
|
255
328
|
*
|
|
256
|
-
*
|
|
329
|
+
* Seeks to the specified position in seconds.
|
|
330
|
+
* Can seek in specific stream or globally.
|
|
257
331
|
*
|
|
258
|
-
*
|
|
332
|
+
* Direct mapping to av_seek_frame().
|
|
259
333
|
*
|
|
260
|
-
* @param timestamp - Target
|
|
261
|
-
* @param streamIndex - Stream
|
|
262
|
-
* @param flags - Seek flags (
|
|
334
|
+
* @param timestamp - Target position in seconds
|
|
335
|
+
* @param streamIndex - Stream index or -1 for global (default: -1)
|
|
336
|
+
* @param flags - Seek flags (default: AVFLAG_NONE)
|
|
337
|
+
* @returns 0 on success, negative on error
|
|
263
338
|
*
|
|
264
|
-
* @
|
|
339
|
+
* @example
|
|
340
|
+
* ```typescript
|
|
341
|
+
* // Seek to 30 seconds
|
|
342
|
+
* const ret = await input.seek(30);
|
|
343
|
+
* FFmpegError.throwIfError(ret, 'seek failed');
|
|
344
|
+
* ```
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* ```typescript
|
|
348
|
+
* import { AVSEEK_FLAG_BACKWARD } from 'node-av/constants';
|
|
349
|
+
*
|
|
350
|
+
* // Seek to keyframe before 60 seconds
|
|
351
|
+
* await input.seek(60, -1, AVSEEK_FLAG_BACKWARD);
|
|
352
|
+
* ```
|
|
353
|
+
*
|
|
354
|
+
* @see {@link AVSeekFlag} For seek flags
|
|
265
355
|
*/
|
|
266
356
|
seek(timestamp: number, streamIndex?: number, flags?: AVSeekFlag): Promise<number>;
|
|
267
357
|
/**
|
|
268
|
-
* Close
|
|
358
|
+
* Close media input and free resources.
|
|
269
359
|
*
|
|
270
|
-
*
|
|
360
|
+
* Releases format context and I/O context.
|
|
361
|
+
* Safe to call multiple times.
|
|
362
|
+
* Automatically called by Symbol.asyncDispose.
|
|
363
|
+
*
|
|
364
|
+
* Direct mapping to avformat_close_input().
|
|
365
|
+
*
|
|
366
|
+
* @example
|
|
367
|
+
* ```typescript
|
|
368
|
+
* const input = await MediaInput.open('video.mp4');
|
|
369
|
+
* try {
|
|
370
|
+
* // Use input
|
|
371
|
+
* } finally {
|
|
372
|
+
* await input.close();
|
|
373
|
+
* }
|
|
374
|
+
* ```
|
|
271
375
|
*
|
|
272
|
-
*
|
|
273
|
-
* use-after-free errors.
|
|
376
|
+
* @see {@link Symbol.asyncDispose} For automatic cleanup
|
|
274
377
|
*/
|
|
275
378
|
close(): Promise<void>;
|
|
276
379
|
/**
|
|
277
|
-
* Get
|
|
380
|
+
* Get underlying format context.
|
|
278
381
|
*
|
|
279
|
-
*
|
|
382
|
+
* Returns the internal format context for advanced operations.
|
|
280
383
|
*
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
* @returns FFmpeg FormatContext
|
|
384
|
+
* @returns Format context
|
|
284
385
|
*
|
|
285
386
|
* @internal
|
|
286
387
|
*/
|
|
287
388
|
getFormatContext(): FormatContext;
|
|
288
389
|
/**
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
* Implements the AsyncDisposable interface for automatic cleanup.
|
|
390
|
+
* Dispose of media input.
|
|
292
391
|
*
|
|
293
|
-
*
|
|
392
|
+
* Implements AsyncDisposable interface for automatic cleanup.
|
|
393
|
+
* Equivalent to calling close().
|
|
294
394
|
*
|
|
295
395
|
* @example
|
|
296
396
|
* ```typescript
|
|
297
397
|
* {
|
|
298
|
-
* await using
|
|
299
|
-
* //
|
|
398
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
399
|
+
* // Process media...
|
|
300
400
|
* } // Automatically closed
|
|
301
401
|
* ```
|
|
402
|
+
*
|
|
403
|
+
* @see {@link close} For manual cleanup
|
|
302
404
|
*/
|
|
303
405
|
[Symbol.asyncDispose](): Promise<void>;
|
|
304
406
|
}
|