webcodecs-node 0.3.0 → 0.5.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.
Files changed (214) hide show
  1. package/dist/__tests__/AudioData.test.js +2 -1
  2. package/dist/__tests__/AudioData.test.js.map +1 -1
  3. package/dist/__tests__/AudioDecoder.test.js +5 -5
  4. package/dist/__tests__/AudioDecoder.test.js.map +1 -1
  5. package/dist/__tests__/AudioEncoder.test.js +3 -3
  6. package/dist/__tests__/AudioEncoder.test.js.map +1 -1
  7. package/dist/__tests__/EncodedChunks.test.js +3 -2
  8. package/dist/__tests__/EncodedChunks.test.js.map +1 -1
  9. package/dist/__tests__/HardwareAcceleration.test.js +2 -1
  10. package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
  11. package/dist/__tests__/ImageDecoder.test.js +16 -45
  12. package/dist/__tests__/ImageDecoder.test.js.map +1 -1
  13. package/dist/__tests__/NodeAvDecoder.test.js +12 -5
  14. package/dist/__tests__/NodeAvDecoder.test.js.map +1 -1
  15. package/dist/__tests__/VideoDecoder.test.js +5 -5
  16. package/dist/__tests__/VideoDecoder.test.js.map +1 -1
  17. package/dist/__tests__/VideoEncoder.test.js +3 -3
  18. package/dist/__tests__/VideoEncoder.test.js.map +1 -1
  19. package/dist/__tests__/VideoFrame.test.js +4 -1
  20. package/dist/__tests__/VideoFrame.test.js.map +1 -1
  21. package/dist/backends/types.d.ts +6 -3
  22. package/dist/backends/types.d.ts.map +1 -1
  23. package/dist/backends/types.js +2 -2
  24. package/dist/backends/types.js.map +1 -1
  25. package/dist/codec-utils/audio-codecs.d.ts +60 -0
  26. package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
  27. package/dist/codec-utils/audio-codecs.js +117 -0
  28. package/dist/codec-utils/audio-codecs.js.map +1 -0
  29. package/dist/codec-utils/formats.d.ts +42 -0
  30. package/dist/codec-utils/formats.d.ts.map +1 -0
  31. package/dist/codec-utils/formats.js +147 -0
  32. package/dist/codec-utils/formats.js.map +1 -0
  33. package/dist/codec-utils/index.d.ts +9 -0
  34. package/dist/codec-utils/index.d.ts.map +1 -0
  35. package/dist/codec-utils/index.js +12 -0
  36. package/dist/codec-utils/index.js.map +1 -0
  37. package/dist/codec-utils/types.d.ts +87 -0
  38. package/dist/codec-utils/types.d.ts.map +1 -0
  39. package/dist/codec-utils/types.js +10 -0
  40. package/dist/codec-utils/types.js.map +1 -0
  41. package/dist/containers/Demuxer.d.ts +114 -0
  42. package/dist/containers/Demuxer.d.ts.map +1 -0
  43. package/dist/containers/Demuxer.js +256 -0
  44. package/dist/containers/Demuxer.js.map +1 -0
  45. package/dist/containers/Muxer.d.ts +142 -0
  46. package/dist/containers/Muxer.d.ts.map +1 -0
  47. package/dist/containers/Muxer.js +295 -0
  48. package/dist/containers/Muxer.js.map +1 -0
  49. package/dist/containers/extract.d.ts +25 -0
  50. package/dist/containers/extract.d.ts.map +1 -0
  51. package/dist/containers/extract.js +64 -0
  52. package/dist/containers/extract.js.map +1 -0
  53. package/dist/containers/index.d.ts +40 -0
  54. package/dist/containers/index.d.ts.map +1 -0
  55. package/dist/containers/index.js +41 -0
  56. package/dist/containers/index.js.map +1 -0
  57. package/dist/containers/transcode.d.ts +138 -0
  58. package/dist/containers/transcode.d.ts.map +1 -0
  59. package/dist/containers/transcode.js +536 -0
  60. package/dist/containers/transcode.js.map +1 -0
  61. package/dist/core/AudioData.d.ts +4 -0
  62. package/dist/core/AudioData.d.ts.map +1 -1
  63. package/dist/core/AudioData.js +56 -4
  64. package/dist/core/AudioData.js.map +1 -1
  65. package/dist/core/EncodedAudioChunk.d.ts +1 -1
  66. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  67. package/dist/core/EncodedAudioChunk.js +1 -1
  68. package/dist/core/EncodedAudioChunk.js.map +1 -1
  69. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  70. package/dist/core/EncodedVideoChunk.js +3 -19
  71. package/dist/core/EncodedVideoChunk.js.map +1 -1
  72. package/dist/core/VideoFrame.d.ts +6 -1
  73. package/dist/core/VideoFrame.d.ts.map +1 -1
  74. package/dist/core/VideoFrame.js +130 -17
  75. package/dist/core/VideoFrame.js.map +1 -1
  76. package/dist/decoders/AudioDecoder.d.ts +8 -0
  77. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  78. package/dist/decoders/AudioDecoder.js +62 -32
  79. package/dist/decoders/AudioDecoder.js.map +1 -1
  80. package/dist/decoders/ImageDecoder.d.ts +0 -3
  81. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  82. package/dist/decoders/ImageDecoder.js +13 -225
  83. package/dist/decoders/ImageDecoder.js.map +1 -1
  84. package/dist/decoders/VideoDecoder.d.ts +8 -0
  85. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  86. package/dist/decoders/VideoDecoder.js +76 -46
  87. package/dist/decoders/VideoDecoder.js.map +1 -1
  88. package/dist/demos/demo-1080p-transcode.d.ts +8 -0
  89. package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
  90. package/dist/demos/demo-1080p-transcode.js +188 -0
  91. package/dist/demos/demo-1080p-transcode.js.map +1 -0
  92. package/dist/demos/demo-containers.d.ts +7 -0
  93. package/dist/demos/demo-containers.d.ts.map +1 -0
  94. package/dist/demos/demo-containers.js +140 -0
  95. package/dist/demos/demo-containers.js.map +1 -0
  96. package/dist/demos/demo-four-corners.js +4 -4
  97. package/dist/demos/demo-four-corners.js.map +1 -1
  98. package/dist/demos/demo-hwaccel-conversion.js +1 -1
  99. package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
  100. package/dist/demos/demo-hwaccel.js +1 -1
  101. package/dist/demos/demo-hwaccel.js.map +1 -1
  102. package/dist/demos/demo-samples.js +4 -4
  103. package/dist/demos/demo-samples.js.map +1 -1
  104. package/dist/demos/demo-streaming.js +6 -6
  105. package/dist/demos/demo-streaming.js.map +1 -1
  106. package/dist/encoders/AudioEncoder.d.ts +8 -0
  107. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  108. package/dist/encoders/AudioEncoder.js +68 -26
  109. package/dist/encoders/AudioEncoder.js.map +1 -1
  110. package/dist/encoders/VideoEncoder.d.ts +8 -0
  111. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  112. package/dist/encoders/VideoEncoder.js +64 -13
  113. package/dist/encoders/VideoEncoder.js.map +1 -1
  114. package/dist/ffmpeg/index.d.ts +3 -2
  115. package/dist/ffmpeg/index.d.ts.map +1 -1
  116. package/dist/ffmpeg/index.js +3 -3
  117. package/dist/ffmpeg/index.js.map +1 -1
  118. package/dist/formats/conversions/batch-converter.d.ts +61 -0
  119. package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
  120. package/dist/formats/conversions/batch-converter.js +274 -0
  121. package/dist/formats/conversions/batch-converter.js.map +1 -0
  122. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  123. package/dist/formats/conversions/frame-converter.js +17 -10
  124. package/dist/formats/conversions/frame-converter.js.map +1 -1
  125. package/dist/formats/conversions/index.d.ts +1 -0
  126. package/dist/formats/conversions/index.d.ts.map +1 -1
  127. package/dist/formats/conversions/index.js +2 -0
  128. package/dist/formats/conversions/index.js.map +1 -1
  129. package/dist/hardware/decoder-args.d.ts +2 -7
  130. package/dist/hardware/decoder-args.d.ts.map +1 -1
  131. package/dist/hardware/decoder-args.js +2 -32
  132. package/dist/hardware/decoder-args.js.map +1 -1
  133. package/dist/hardware/encoder-args.d.ts +2 -11
  134. package/dist/hardware/encoder-args.d.ts.map +1 -1
  135. package/dist/hardware/encoder-args.js +2 -71
  136. package/dist/hardware/encoder-args.js.map +1 -1
  137. package/dist/hardware/index.d.ts +2 -2
  138. package/dist/hardware/index.d.ts.map +1 -1
  139. package/dist/hardware/index.js +2 -2
  140. package/dist/hardware/index.js.map +1 -1
  141. package/dist/index.d.ts +5 -7
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +5 -6
  144. package/dist/index.js.map +1 -1
  145. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +3 -2
  146. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
  147. package/dist/mediabunny/FFmpegAudioDecoder.js +5 -8
  148. package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
  149. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +3 -2
  150. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
  151. package/dist/mediabunny/FFmpegAudioEncoder.js +3 -2
  152. package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
  153. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +4 -3
  154. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
  155. package/dist/mediabunny/FFmpegVideoDecoder.js +6 -9
  156. package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
  157. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +4 -3
  158. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
  159. package/dist/mediabunny/FFmpegVideoEncoder.js +4 -3
  160. package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
  161. package/dist/node-av/NodeAvAudioDecoder.d.ts +2 -2
  162. package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -1
  163. package/dist/node-av/NodeAvAudioDecoder.js +63 -56
  164. package/dist/node-av/NodeAvAudioDecoder.js.map +1 -1
  165. package/dist/node-av/NodeAvAudioEncoder.d.ts +6 -0
  166. package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -1
  167. package/dist/node-av/NodeAvAudioEncoder.js +166 -45
  168. package/dist/node-av/NodeAvAudioEncoder.js.map +1 -1
  169. package/dist/node-av/NodeAvImageDecoder.d.ts +28 -9
  170. package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -1
  171. package/dist/node-av/NodeAvImageDecoder.js +156 -37
  172. package/dist/node-av/NodeAvImageDecoder.js.map +1 -1
  173. package/dist/node-av/NodeAvVideoDecoder.d.ts +1 -1
  174. package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -1
  175. package/dist/node-av/NodeAvVideoDecoder.js +20 -16
  176. package/dist/node-av/NodeAvVideoDecoder.js.map +1 -1
  177. package/dist/node-av/NodeAvVideoEncoder.d.ts +12 -0
  178. package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
  179. package/dist/node-av/NodeAvVideoEncoder.js +175 -63
  180. package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
  181. package/dist/polyfill.d.ts.map +1 -1
  182. package/dist/polyfill.js +11 -9
  183. package/dist/polyfill.js.map +1 -1
  184. package/dist/utils/aac.d.ts.map +1 -1
  185. package/dist/utils/aac.js +6 -0
  186. package/dist/utils/aac.js.map +1 -1
  187. package/dist/utils/buffer-pool.d.ts +109 -0
  188. package/dist/utils/buffer-pool.d.ts.map +1 -0
  189. package/dist/utils/buffer-pool.js +278 -0
  190. package/dist/utils/buffer-pool.js.map +1 -0
  191. package/dist/utils/codec-cache.d.ts +65 -0
  192. package/dist/utils/codec-cache.d.ts.map +1 -0
  193. package/dist/utils/codec-cache.js +116 -0
  194. package/dist/utils/codec-cache.js.map +1 -0
  195. package/dist/utils/errors.d.ts +62 -0
  196. package/dist/utils/errors.d.ts.map +1 -0
  197. package/dist/utils/errors.js +84 -0
  198. package/dist/utils/errors.js.map +1 -0
  199. package/dist/utils/hardware-pool.d.ts +88 -0
  200. package/dist/utils/hardware-pool.d.ts.map +1 -0
  201. package/dist/utils/hardware-pool.js +266 -0
  202. package/dist/utils/hardware-pool.js.map +1 -0
  203. package/dist/utils/index.d.ts +5 -0
  204. package/dist/utils/index.d.ts.map +1 -1
  205. package/dist/utils/index.js +10 -0
  206. package/dist/utils/index.js.map +1 -1
  207. package/dist/utils/timeout.d.ts +44 -0
  208. package/dist/utils/timeout.d.ts.map +1 -0
  209. package/dist/utils/timeout.js +73 -0
  210. package/dist/utils/timeout.js.map +1 -0
  211. package/dist/utils/type-guards.d.ts +11 -1
  212. package/dist/utils/type-guards.d.ts.map +1 -1
  213. package/dist/utils/type-guards.js.map +1 -1
  214. package/package.json +13 -35
@@ -0,0 +1,536 @@
1
+ /**
2
+ * High-level transcoding utilities using node-av
3
+ *
4
+ * Provides easy-to-use functions for common transcoding operations.
5
+ * Uses node-av internally for efficient end-to-end processing.
6
+ */
7
+ import { Demuxer as NodeAvDemuxer, Muxer as NodeAvMuxer, Decoder as NodeAvDecoder, Encoder as NodeAvEncoder, HardwareContext, FilterAPI, AV_CODEC_ID_H264, AV_CODEC_ID_HEVC, AV_CODEC_ID_VP8, AV_CODEC_ID_VP9, AV_CODEC_ID_AV1, AV_CODEC_ID_AAC, AV_CODEC_ID_OPUS, AV_CODEC_ID_MP3, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NV12, } from 'node-av';
8
+ import { Demuxer } from './Demuxer.js';
9
+ import { StreamCopier } from './Muxer.js';
10
+ /**
11
+ * Map video codec string to FFmpeg codec ID
12
+ */
13
+ function getVideoCodecId(codec) {
14
+ switch (codec) {
15
+ case 'h264':
16
+ return AV_CODEC_ID_H264;
17
+ case 'hevc':
18
+ return AV_CODEC_ID_HEVC;
19
+ case 'vp8':
20
+ return AV_CODEC_ID_VP8;
21
+ case 'vp9':
22
+ return AV_CODEC_ID_VP9;
23
+ case 'av1':
24
+ return AV_CODEC_ID_AV1;
25
+ default:
26
+ return AV_CODEC_ID_H264;
27
+ }
28
+ }
29
+ /**
30
+ * Map audio codec string to FFmpeg codec ID
31
+ */
32
+ function getAudioCodecId(codec) {
33
+ switch (codec) {
34
+ case 'aac':
35
+ return AV_CODEC_ID_AAC;
36
+ case 'opus':
37
+ return AV_CODEC_ID_OPUS;
38
+ case 'mp3':
39
+ return AV_CODEC_ID_MP3;
40
+ default:
41
+ return AV_CODEC_ID_AAC;
42
+ }
43
+ }
44
+ /**
45
+ * Build filter chain for transcoding based on hardware configuration
46
+ * Handles: hardware frame download, format conversion, and optionally hardware upload
47
+ */
48
+ function buildTranscodeFilterChain(hwType, hwDecoder, hwEncoder, targetFormat) {
49
+ // Case 1: Both hardware - try to stay on GPU
50
+ if (hwDecoder && hwEncoder) {
51
+ switch (hwType) {
52
+ case 'vaapi':
53
+ return `scale_vaapi=format=${targetFormat}`;
54
+ case 'cuda':
55
+ return `scale_cuda=format=${targetFormat}`;
56
+ case 'qsv':
57
+ return `vpp_qsv=format=${targetFormat}`;
58
+ case 'videotoolbox':
59
+ return `scale_vt=format=${targetFormat}`;
60
+ }
61
+ }
62
+ // Case 2: Hardware decoder only - download and convert
63
+ if (hwDecoder && !hwEncoder) {
64
+ return `hwdownload,format=nv12,format=${targetFormat}`;
65
+ }
66
+ // Case 3: Hardware encoder only - convert and upload
67
+ if (!hwDecoder && hwEncoder) {
68
+ switch (hwType) {
69
+ case 'vaapi':
70
+ return `format=nv12,hwupload`;
71
+ case 'cuda':
72
+ return `format=nv12,hwupload_cuda`;
73
+ case 'qsv':
74
+ return `format=nv12,hwupload=extra_hw_frames=64`;
75
+ case 'videotoolbox':
76
+ return `format=nv12,hwupload`;
77
+ }
78
+ }
79
+ // Case 4: Both software - no filter needed
80
+ return null;
81
+ }
82
+ /**
83
+ * Infer container format from file extension
84
+ */
85
+ function inferFormat(path) {
86
+ const ext = path.split('.').pop()?.toLowerCase();
87
+ switch (ext) {
88
+ case 'mp4':
89
+ case 'm4v':
90
+ return 'mp4';
91
+ case 'webm':
92
+ return 'webm';
93
+ case 'mkv':
94
+ return 'matroska';
95
+ case 'mov':
96
+ return 'mov';
97
+ case 'avi':
98
+ return 'avi';
99
+ case 'ts':
100
+ return 'mpegts';
101
+ default:
102
+ return 'mp4';
103
+ }
104
+ }
105
+ /**
106
+ * Remux a file from one container format to another without re-encoding
107
+ *
108
+ * This is a fast operation that just changes the container format.
109
+ * The video and audio streams are copied without modification.
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * // Convert MP4 to MKV container (keeping same codecs)
114
+ * await remux('input.mp4', 'output.mkv');
115
+ * ```
116
+ */
117
+ export async function remux(inputPath, outputPath) {
118
+ await StreamCopier.remux(inputPath, outputPath);
119
+ }
120
+ /**
121
+ * Transcode a video file to different codecs/settings
122
+ *
123
+ * Uses node-av internally for efficient end-to-end processing.
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * // Convert to H.264 with lower bitrate
128
+ * await transcode('input.mp4', 'output.mp4', {
129
+ * videoCodec: 'h264',
130
+ * videoBitrate: 1_000_000,
131
+ * });
132
+ *
133
+ * // Convert to VP9 WebM
134
+ * await transcode('input.mp4', 'output.webm', {
135
+ * videoCodec: 'vp9',
136
+ * videoBitrate: 2_000_000,
137
+ * });
138
+ * ```
139
+ */
140
+ export async function transcode(inputPath, outputPath, options = {}) {
141
+ // Check for stream copy mode
142
+ if (options.videoCodec === 'copy' && options.audioCodec === 'copy') {
143
+ await remux(inputPath, outputPath);
144
+ const { stat } = await import('fs/promises');
145
+ const info = await stat(outputPath);
146
+ return { videoFrames: 0, audioFrames: 0, outputSize: info.size };
147
+ }
148
+ // Open input
149
+ const demuxer = await NodeAvDemuxer.open(inputPath);
150
+ const inputVideo = demuxer.video();
151
+ const inputAudio = demuxer.audio();
152
+ if (!inputVideo && !inputAudio) {
153
+ await demuxer.close();
154
+ throw new Error('No video or audio streams in input file');
155
+ }
156
+ // Setup hardware acceleration if requested
157
+ const useHardware = options.hardwareAcceleration === 'prefer-hardware';
158
+ let hardware = null;
159
+ let videoFilter = null;
160
+ let usingHardwareDecoder = false;
161
+ let usingHardwareEncoder = false;
162
+ if (useHardware) {
163
+ // Try hardware backends in order of reliability
164
+ // VAAPI tends to be more stable on Linux than QSV
165
+ const hwTypesToTry = ['vaapi', 'cuda', 'qsv', 'videotoolbox'];
166
+ for (const hwType of hwTypesToTry) {
167
+ try {
168
+ hardware = HardwareContext.create(hwType);
169
+ console.log(`Using hardware acceleration: ${hardware?.deviceTypeName}`);
170
+ break;
171
+ }
172
+ catch {
173
+ // Try next backend
174
+ }
175
+ }
176
+ if (!hardware) {
177
+ try {
178
+ // Fallback to auto-detection
179
+ hardware = HardwareContext.auto();
180
+ console.log(`Using hardware acceleration (auto): ${hardware?.deviceTypeName}`);
181
+ }
182
+ catch {
183
+ console.log('Hardware acceleration not available, using software');
184
+ hardware = null;
185
+ }
186
+ }
187
+ }
188
+ // Create output muxer
189
+ const format = options.format || inferFormat(outputPath);
190
+ const muxer = await NodeAvMuxer.open(outputPath, { format });
191
+ // Setup video pipeline
192
+ let videoDecoder = null;
193
+ let videoEncoder = null;
194
+ let videoOutStreamIndex = -1;
195
+ let videoFrameCount = 0;
196
+ let videoPacketCount = 0;
197
+ if (inputVideo && options.videoCodec !== 'copy') {
198
+ const cp = inputVideo.codecpar;
199
+ const outputWidth = options.width || cp.width;
200
+ const outputHeight = options.height || cp.height;
201
+ const outputCodecId = getVideoCodecId(options.videoCodec || 'h264');
202
+ const codecName = options.videoCodec || 'h264';
203
+ // Create decoder with hardware acceleration if available
204
+ try {
205
+ videoDecoder = await NodeAvDecoder.create(inputVideo, {
206
+ hardware: hardware ?? undefined,
207
+ extraHwFrames: 64, // Allocate extra frames for hardware decoding pipeline
208
+ });
209
+ usingHardwareDecoder = hardware !== null && videoDecoder.isHardware?.();
210
+ if (usingHardwareDecoder) {
211
+ console.log(`Using hardware decoder for ${codecName}`);
212
+ }
213
+ }
214
+ catch (decErr) {
215
+ // Fallback to software decoder
216
+ console.log(`Hardware decoder failed: ${decErr.message}, using software`);
217
+ videoDecoder = await NodeAvDecoder.create(inputVideo);
218
+ }
219
+ // Create encoder with hardware acceleration if available
220
+ let encoderCodec = outputCodecId;
221
+ let encoderPixelFormat = AV_PIX_FMT_YUV420P;
222
+ if (hardware) {
223
+ try {
224
+ const hwCodec = hardware.getEncoderCodec(codecName);
225
+ if (hwCodec) {
226
+ encoderCodec = hwCodec;
227
+ encoderPixelFormat = AV_PIX_FMT_NV12; // Hardware encoders typically use NV12
228
+ usingHardwareEncoder = true;
229
+ console.log(`Using hardware encoder for ${codecName}`);
230
+ }
231
+ }
232
+ catch {
233
+ // Fallback to software encoder
234
+ }
235
+ }
236
+ // Create encoder
237
+ try {
238
+ videoEncoder = await NodeAvEncoder.create(encoderCodec, {
239
+ width: outputWidth,
240
+ height: outputHeight,
241
+ pixelFormat: encoderPixelFormat,
242
+ timeBase: { num: 1, den: options.framerate || 30 },
243
+ frameRate: { num: options.framerate || 30, den: 1 },
244
+ bitrate: options.videoBitrate || 1_000_000,
245
+ gopSize: options.gopSize || 30,
246
+ hardware: usingHardwareEncoder ? hardware ?? undefined : undefined,
247
+ extraHwFrames: 64,
248
+ });
249
+ }
250
+ catch (encErr) {
251
+ // Fallback to software encoder if hardware fails
252
+ if (usingHardwareEncoder) {
253
+ console.log(`Hardware encoder failed: ${encErr.message}, using software`);
254
+ usingHardwareEncoder = false;
255
+ encoderPixelFormat = AV_PIX_FMT_YUV420P;
256
+ videoEncoder = await NodeAvEncoder.create(outputCodecId, {
257
+ width: outputWidth,
258
+ height: outputHeight,
259
+ pixelFormat: encoderPixelFormat,
260
+ timeBase: { num: 1, den: options.framerate || 30 },
261
+ frameRate: { num: options.framerate || 30, den: 1 },
262
+ bitrate: options.videoBitrate || 1_000_000,
263
+ gopSize: options.gopSize || 30,
264
+ });
265
+ }
266
+ else {
267
+ throw encErr;
268
+ }
269
+ }
270
+ // Create video filter for format conversion between decoder and encoder
271
+ // This handles: hardware frame download, format conversion, and optionally hardware upload
272
+ // Created AFTER encoder is finalized to know the actual configuration
273
+ if (usingHardwareDecoder || usingHardwareEncoder) {
274
+ const filterChain = buildTranscodeFilterChain(hardware?.deviceTypeName || 'software', usingHardwareDecoder, usingHardwareEncoder, encoderPixelFormat === AV_PIX_FMT_NV12 ? 'nv12' : 'yuv420p');
275
+ if (filterChain) {
276
+ try {
277
+ videoFilter = FilterAPI.create(filterChain, {
278
+ hardware: hardware ?? undefined,
279
+ });
280
+ console.log(`Using filter chain: ${filterChain}`);
281
+ }
282
+ catch (err) {
283
+ console.log(`Filter chain failed, using simple format conversion: ${err.message}`);
284
+ // Fallback to simple format conversion
285
+ videoFilter = FilterAPI.create(`format=${encoderPixelFormat === AV_PIX_FMT_NV12 ? 'nv12' : 'yuv420p'}`);
286
+ }
287
+ }
288
+ }
289
+ videoOutStreamIndex = muxer.addStream(videoEncoder);
290
+ }
291
+ else if (inputVideo && options.videoCodec === 'copy') {
292
+ // Stream copy video
293
+ videoOutStreamIndex = muxer.addStream(inputVideo);
294
+ }
295
+ // Setup audio pipeline
296
+ let audioDecoder = null;
297
+ let audioEncoder = null;
298
+ let audioOutStreamIndex = -1;
299
+ let audioFrameCount = 0;
300
+ if (inputAudio && options.audioCodec !== 'copy') {
301
+ const cp = inputAudio.codecpar;
302
+ const outputCodecId = getAudioCodecId(options.audioCodec || 'aac');
303
+ // Create decoder
304
+ audioDecoder = await NodeAvDecoder.create(inputAudio);
305
+ // Create encoder
306
+ audioEncoder = await NodeAvEncoder.create(outputCodecId, {
307
+ sampleRate: options.sampleRate || cp.sampleRate,
308
+ channels: options.numberOfChannels || cp.channels,
309
+ bitrate: options.audioBitrate || 128_000,
310
+ });
311
+ audioOutStreamIndex = muxer.addStream(audioEncoder);
312
+ }
313
+ else if (inputAudio && options.audioCodec === 'copy') {
314
+ // Stream copy audio
315
+ audioOutStreamIndex = muxer.addStream(inputAudio);
316
+ }
317
+ // Helper to drain encoder packets
318
+ async function drainVideoEncoder() {
319
+ if (!videoEncoder)
320
+ return;
321
+ while (true) {
322
+ try {
323
+ const pkt = await videoEncoder.receive();
324
+ if (pkt) {
325
+ await muxer.writePacket(pkt, videoOutStreamIndex);
326
+ videoPacketCount++;
327
+ }
328
+ else
329
+ break;
330
+ }
331
+ catch {
332
+ break;
333
+ }
334
+ }
335
+ }
336
+ async function drainAudioEncoder() {
337
+ if (!audioEncoder)
338
+ return;
339
+ while (true) {
340
+ try {
341
+ const pkt = await audioEncoder.receive();
342
+ if (pkt) {
343
+ await muxer.writePacket(pkt, audioOutStreamIndex);
344
+ }
345
+ else
346
+ break;
347
+ }
348
+ catch {
349
+ break;
350
+ }
351
+ }
352
+ }
353
+ // Helper to drain decoder frames and encode
354
+ async function drainVideoDecoder() {
355
+ if (!videoDecoder || !videoEncoder)
356
+ return;
357
+ while (true) {
358
+ try {
359
+ let frame = await videoDecoder.receive();
360
+ if (!frame)
361
+ break;
362
+ // Apply video filter if present (handles hw download/upload and format conversion)
363
+ if (videoFilter) {
364
+ try {
365
+ await videoFilter.process(frame);
366
+ frame.free();
367
+ frame = await videoFilter.receive();
368
+ if (!frame)
369
+ continue;
370
+ }
371
+ catch (filterErr) {
372
+ // Filter failed, try to continue without it
373
+ console.warn(`Filter processing failed: ${filterErr.message}`);
374
+ frame.free();
375
+ continue;
376
+ }
377
+ }
378
+ frame.pts = BigInt(videoFrameCount);
379
+ videoFrameCount++;
380
+ await videoEncoder.encode(frame);
381
+ frame.free();
382
+ await drainVideoEncoder();
383
+ // Report progress
384
+ if (options.onProgress) {
385
+ const duration = demuxer.duration || 0;
386
+ options.onProgress({
387
+ videoFrames: videoFrameCount,
388
+ audioFrames: audioFrameCount,
389
+ progress: duration > 0 ? videoFrameCount / (duration * 30) : undefined,
390
+ });
391
+ }
392
+ }
393
+ catch {
394
+ break;
395
+ }
396
+ }
397
+ }
398
+ async function drainAudioDecoder() {
399
+ if (!audioDecoder || !audioEncoder)
400
+ return;
401
+ while (true) {
402
+ try {
403
+ const frame = await audioDecoder.receive();
404
+ if (!frame)
405
+ break;
406
+ audioFrameCount++;
407
+ await audioEncoder.encode(frame);
408
+ frame.free();
409
+ await drainAudioEncoder();
410
+ }
411
+ catch {
412
+ break;
413
+ }
414
+ }
415
+ }
416
+ // Process all packets
417
+ let hardwareDecodeFailed = false;
418
+ for await (const packet of demuxer.packets()) {
419
+ if (!packet)
420
+ continue;
421
+ if (packet.streamIndex === inputVideo?.index) {
422
+ if (videoDecoder && videoEncoder && !hardwareDecodeFailed) {
423
+ // Transcode video
424
+ try {
425
+ await videoDecoder.decode(packet);
426
+ await drainVideoDecoder();
427
+ }
428
+ catch (decodeErr) {
429
+ // Hardware decoding can fail mid-stream, rethrow with context
430
+ const errMsg = decodeErr.message;
431
+ if (errMsg.includes('allocate') || errMsg.includes('memory') || errMsg.includes('hardware')) {
432
+ throw new Error(`Hardware decoding failed: ${errMsg}. Try with hardwareAcceleration: 'prefer-software'`);
433
+ }
434
+ throw decodeErr;
435
+ }
436
+ }
437
+ else if (videoOutStreamIndex >= 0) {
438
+ // Stream copy video
439
+ await muxer.writePacket(packet, videoOutStreamIndex);
440
+ videoPacketCount++;
441
+ }
442
+ }
443
+ else if (packet.streamIndex === inputAudio?.index) {
444
+ if (audioDecoder && audioEncoder) {
445
+ // Transcode audio
446
+ await audioDecoder.decode(packet);
447
+ await drainAudioDecoder();
448
+ }
449
+ else if (audioOutStreamIndex >= 0) {
450
+ // Stream copy audio
451
+ await muxer.writePacket(packet, audioOutStreamIndex);
452
+ }
453
+ }
454
+ }
455
+ // Flush decoders and encoders
456
+ if (videoDecoder) {
457
+ await videoDecoder.flush();
458
+ await drainVideoDecoder();
459
+ }
460
+ if (videoEncoder) {
461
+ await videoEncoder.flush();
462
+ await drainVideoEncoder();
463
+ }
464
+ if (audioDecoder) {
465
+ await audioDecoder.flush();
466
+ await drainAudioDecoder();
467
+ }
468
+ if (audioEncoder) {
469
+ await audioEncoder.flush();
470
+ await drainAudioEncoder();
471
+ }
472
+ // Close everything
473
+ if (videoFilter)
474
+ videoFilter.close();
475
+ if (videoDecoder)
476
+ await videoDecoder.close();
477
+ if (videoEncoder)
478
+ await videoEncoder.close();
479
+ if (audioDecoder)
480
+ await audioDecoder.close();
481
+ if (audioEncoder)
482
+ await audioEncoder.close();
483
+ if (hardware)
484
+ hardware.dispose();
485
+ await demuxer.close();
486
+ await muxer.close();
487
+ // Get output file size
488
+ const { stat } = await import('fs/promises');
489
+ const info = await stat(outputPath);
490
+ return {
491
+ videoFrames: videoFrameCount,
492
+ audioFrames: audioFrameCount,
493
+ outputSize: info.size,
494
+ };
495
+ }
496
+ export async function getMediaInfo(inputPath) {
497
+ const demuxer = new Demuxer({ path: inputPath });
498
+ await demuxer.open();
499
+ const info = {
500
+ format: demuxer.format || 'unknown',
501
+ duration: demuxer.duration || 0,
502
+ };
503
+ const videoConfig = demuxer.videoConfig;
504
+ if (videoConfig) {
505
+ info.video = {
506
+ codec: videoConfig.codec,
507
+ width: videoConfig.codedWidth,
508
+ height: videoConfig.codedHeight,
509
+ };
510
+ }
511
+ const audioConfig = demuxer.audioConfig;
512
+ if (audioConfig) {
513
+ info.audio = {
514
+ codec: audioConfig.codec,
515
+ sampleRate: audioConfig.sampleRate,
516
+ channels: audioConfig.numberOfChannels,
517
+ };
518
+ }
519
+ await demuxer.close();
520
+ return info;
521
+ }
522
+ /**
523
+ * Extract video frames from a container file as VideoFrame objects
524
+ *
525
+ * @example
526
+ * ```typescript
527
+ * import { extractVideoFrames } from 'webcodecs-node/containers';
528
+ *
529
+ * for await (const frame of extractVideoFrames('input.mp4')) {
530
+ * console.log(`Frame: ${frame.timestamp}us`);
531
+ * frame.close();
532
+ * }
533
+ * ```
534
+ */
535
+ export { extractVideoFrames } from './extract.js';
536
+ //# sourceMappingURL=transcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode.js","sourceRoot":"","sources":["../../src/containers/transcode.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export declare class AudioData {
12
12
  private _timestamp;
13
13
  private _duration;
14
14
  private _buffer;
15
+ private _nativeFrame;
16
+ private _nativeCleanup;
15
17
  private _closed;
16
18
  constructor(init: AudioDataInit);
17
19
  get format(): AudioSampleFormat | null;
@@ -25,7 +27,9 @@ export declare class AudioData {
25
27
  clone(): AudioData;
26
28
  close(): void;
27
29
  get _rawBuffer(): ArrayBuffer;
30
+ get _native(): any | null;
28
31
  private _checkClosed;
32
+ private _ensureBuffer;
29
33
  private _isPlanar;
30
34
  private _calculateTotalSize;
31
35
  private _copyDirect;
@@ -1 +1 @@
1
- {"version":3,"file":"AudioData.d.ts","sourceRoot":"","sources":["../../src/core/AudioData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAO3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAC;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,aAAa;IAoE/B,IAAI,MAAM,IAAI,iBAAiB,GAAG,IAAI,CAA+C;IACrF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,cAAc,IAAI,MAAM,CAAoD;IAChF,IAAI,gBAAgB,IAAI,MAAM,CAAsD;IACpF,IAAI,SAAS,IAAI,MAAM,CAA+C;IACtE,IAAI,QAAQ,IAAI,MAAM,CAA8C;IAEpE,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM;IAcvD,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAmC3E,KAAK,IAAI,SAAS;IAalB,KAAK,IAAI,IAAI;IAKb,IAAI,UAAU,IAAI,WAAW,CAG5B;IAED,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,mBAAmB;IAuC3B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;CAUrB"}
1
+ {"version":3,"file":"AudioData.d.ts","sourceRoot":"","sources":["../../src/core/AudioData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAO3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAC;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,aAAa;IAyE/B,IAAI,MAAM,IAAI,iBAAiB,GAAG,IAAI,CAA+C;IACrF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,cAAc,IAAI,MAAM,CAAoD;IAChF,IAAI,gBAAgB,IAAI,MAAM,CAAsD;IACpF,IAAI,SAAS,IAAI,MAAM,CAA+C;IACtE,IAAI,QAAQ,IAAI,MAAM,CAA8C;IAEpE,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM;IAevD,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAoC3E,KAAK,IAAI,SAAS;IAclB,KAAK,IAAI,IAAI;IAcb,IAAI,UAAU,IAAI,WAAW,CAI5B;IAED,IAAI,OAAO,IAAI,GAAG,GAAG,IAAI,CAExB;IAED,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,mBAAmB;IAuC3B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;CAUrB"}