webcodecs-node 0.3.0 → 0.5.1
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/dist/backends/types.d.ts +6 -3
- package/dist/backends/types.d.ts.map +1 -1
- package/dist/backends/types.js +2 -2
- package/dist/backends/types.js.map +1 -1
- package/dist/{ffmpeg → codec-utils}/audio-codecs.d.ts +13 -12
- package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/audio-codecs.js +29 -11
- package/dist/codec-utils/audio-codecs.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/formats.d.ts +7 -7
- package/dist/codec-utils/formats.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/formats.js +7 -7
- package/dist/codec-utils/formats.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/index.d.ts +3 -3
- package/dist/codec-utils/index.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/index.js +3 -4
- package/dist/codec-utils/index.js.map +1 -0
- package/dist/{ffmpeg → codec-utils}/types.d.ts +13 -11
- package/dist/codec-utils/types.d.ts.map +1 -0
- package/dist/{ffmpeg → codec-utils}/types.js +3 -1
- package/dist/codec-utils/types.js.map +1 -0
- package/dist/containers/Demuxer.d.ts +114 -0
- package/dist/containers/Demuxer.d.ts.map +1 -0
- package/dist/containers/Demuxer.js +256 -0
- package/dist/containers/Demuxer.js.map +1 -0
- package/dist/containers/Muxer.d.ts +142 -0
- package/dist/containers/Muxer.d.ts.map +1 -0
- package/dist/containers/Muxer.js +295 -0
- package/dist/containers/Muxer.js.map +1 -0
- package/dist/containers/extract.d.ts +25 -0
- package/dist/containers/extract.d.ts.map +1 -0
- package/dist/containers/extract.js +64 -0
- package/dist/containers/extract.js.map +1 -0
- package/dist/containers/index.d.ts +40 -0
- package/dist/containers/index.d.ts.map +1 -0
- package/dist/containers/index.js +41 -0
- package/dist/containers/index.js.map +1 -0
- package/dist/containers/transcode.d.ts +138 -0
- package/dist/containers/transcode.d.ts.map +1 -0
- package/dist/containers/transcode.js +536 -0
- package/dist/containers/transcode.js.map +1 -0
- package/dist/core/AudioData.d.ts +4 -0
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +56 -4
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +1 -1
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +3 -19
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +6 -1
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +130 -17
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +8 -0
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +62 -32
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +0 -3
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +13 -225
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +8 -0
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +76 -46
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/demos/demo-1080p-transcode.d.ts +8 -0
- package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
- package/dist/demos/demo-1080p-transcode.js +188 -0
- package/dist/demos/demo-1080p-transcode.js.map +1 -0
- package/dist/demos/demo-containers.d.ts +7 -0
- package/dist/demos/demo-containers.d.ts.map +1 -0
- package/dist/demos/demo-containers.js +140 -0
- package/dist/demos/demo-containers.js.map +1 -0
- package/dist/demos/demo-four-corners.js +4 -4
- package/dist/demos/demo-four-corners.js.map +1 -1
- package/dist/demos/demo-hwaccel.js +1 -1
- package/dist/demos/demo-hwaccel.js.map +1 -1
- package/dist/demos/demo-samples.js +4 -4
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/demos/demo-streaming.js +6 -6
- package/dist/demos/demo-streaming.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +8 -0
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +68 -26
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +8 -0
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +64 -13
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/formats/conversions/batch-converter.d.ts +61 -0
- package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
- package/dist/formats/conversions/batch-converter.js +274 -0
- package/dist/formats/conversions/batch-converter.js.map +1 -0
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +17 -10
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +1 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +2 -0
- package/dist/formats/conversions/index.js.map +1 -1
- package/dist/hardware/decoder-args.d.ts +2 -7
- package/dist/hardware/decoder-args.d.ts.map +1 -1
- package/dist/hardware/decoder-args.js +2 -32
- package/dist/hardware/decoder-args.js.map +1 -1
- package/dist/hardware/encoder-args.d.ts +2 -11
- package/dist/hardware/encoder-args.d.ts.map +1 -1
- package/dist/hardware/encoder-args.js +2 -71
- package/dist/hardware/encoder-args.js.map +1 -1
- package/dist/hardware/index.d.ts +2 -2
- package/dist/hardware/index.d.ts.map +1 -1
- package/dist/hardware/index.js +2 -2
- package/dist/hardware/index.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/node-av/NodeAvAudioDecoder.d.ts +2 -2
- package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvAudioDecoder.js +63 -56
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -1
- package/dist/node-av/NodeAvAudioEncoder.d.ts +6 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvAudioEncoder.js +166 -45
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -1
- package/dist/node-av/NodeAvImageDecoder.d.ts +28 -9
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvImageDecoder.js +156 -37
- package/dist/node-av/NodeAvImageDecoder.js.map +1 -1
- package/dist/node-av/NodeAvVideoDecoder.d.ts +1 -1
- package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvVideoDecoder.js +20 -16
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.d.ts +12 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.js +175 -63
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
- package/dist/polyfill.d.ts.map +1 -1
- package/dist/polyfill.js +11 -9
- package/dist/polyfill.js.map +1 -1
- package/dist/utils/aac.d.ts.map +1 -1
- package/dist/utils/aac.js +6 -0
- package/dist/utils/aac.js.map +1 -1
- package/dist/utils/buffer-pool.d.ts +109 -0
- package/dist/utils/buffer-pool.d.ts.map +1 -0
- package/dist/utils/buffer-pool.js +278 -0
- package/dist/utils/buffer-pool.js.map +1 -0
- package/dist/utils/codec-cache.d.ts +65 -0
- package/dist/utils/codec-cache.d.ts.map +1 -0
- package/dist/utils/codec-cache.js +116 -0
- package/dist/utils/codec-cache.js.map +1 -0
- package/dist/utils/errors.d.ts +62 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +84 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/hardware-pool.d.ts +88 -0
- package/dist/utils/hardware-pool.d.ts.map +1 -0
- package/dist/utils/hardware-pool.js +266 -0
- package/dist/utils/hardware-pool.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/timeout.d.ts +44 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +73 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/utils/type-guards.d.ts +11 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js.map +1 -1
- package/package.json +13 -35
- package/dist/AudioData.d.ts +0 -6
- package/dist/AudioData.d.ts.map +0 -1
- package/dist/AudioData.js +0 -6
- package/dist/AudioData.js.map +0 -1
- package/dist/AudioDecoder.d.ts +0 -6
- package/dist/AudioDecoder.d.ts.map +0 -1
- package/dist/AudioDecoder.js +0 -6
- package/dist/AudioDecoder.js.map +0 -1
- package/dist/AudioEncoder.d.ts +0 -6
- package/dist/AudioEncoder.d.ts.map +0 -1
- package/dist/AudioEncoder.js +0 -6
- package/dist/AudioEncoder.js.map +0 -1
- package/dist/EncodedAudioChunk.d.ts +0 -6
- package/dist/EncodedAudioChunk.d.ts.map +0 -1
- package/dist/EncodedAudioChunk.js +0 -6
- package/dist/EncodedAudioChunk.js.map +0 -1
- package/dist/EncodedVideoChunk.d.ts +0 -6
- package/dist/EncodedVideoChunk.d.ts.map +0 -1
- package/dist/EncodedVideoChunk.js +0 -6
- package/dist/EncodedVideoChunk.js.map +0 -1
- package/dist/FFmpegProcess.d.ts +0 -6
- package/dist/FFmpegProcess.d.ts.map +0 -1
- package/dist/FFmpegProcess.js +0 -6
- package/dist/FFmpegProcess.js.map +0 -1
- package/dist/HardwareAcceleration.d.ts +0 -6
- package/dist/HardwareAcceleration.d.ts.map +0 -1
- package/dist/HardwareAcceleration.js +0 -6
- package/dist/HardwareAcceleration.js.map +0 -1
- package/dist/ImageDecoder.d.ts +0 -6
- package/dist/ImageDecoder.d.ts.map +0 -1
- package/dist/ImageDecoder.js +0 -6
- package/dist/ImageDecoder.js.map +0 -1
- package/dist/Logger.d.ts +0 -6
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -6
- package/dist/Logger.js.map +0 -1
- package/dist/MediaCapabilities.d.ts +0 -9
- package/dist/MediaCapabilities.d.ts.map +0 -1
- package/dist/MediaCapabilities.js +0 -8
- package/dist/MediaCapabilities.js.map +0 -1
- package/dist/VideoDecoder.d.ts +0 -6
- package/dist/VideoDecoder.d.ts.map +0 -1
- package/dist/VideoDecoder.js +0 -6
- package/dist/VideoDecoder.js.map +0 -1
- package/dist/VideoEncoder.d.ts +0 -6
- package/dist/VideoEncoder.d.ts.map +0 -1
- package/dist/VideoEncoder.js +0 -6
- package/dist/VideoEncoder.js.map +0 -1
- package/dist/VideoFrame.d.ts +0 -10
- package/dist/VideoFrame.d.ts.map +0 -1
- package/dist/VideoFrame.js +0 -9
- package/dist/VideoFrame.js.map +0 -1
- package/dist/__tests__/AudioData.test.d.ts +0 -5
- package/dist/__tests__/AudioData.test.d.ts.map +0 -1
- package/dist/__tests__/AudioData.test.js +0 -179
- package/dist/__tests__/AudioData.test.js.map +0 -1
- package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
- package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioDecoder.test.js +0 -733
- package/dist/__tests__/AudioDecoder.test.js.map +0 -1
- package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
- package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioEncoder.test.js +0 -247
- package/dist/__tests__/AudioEncoder.test.js.map +0 -1
- package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
- package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
- package/dist/__tests__/EncodedChunks.test.js +0 -99
- package/dist/__tests__/EncodedChunks.test.js.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
- package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.js +0 -84
- package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
- package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.test.js +0 -587
- package/dist/__tests__/ImageDecoder.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
- package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.js +0 -346
- package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.js +0 -199
- package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.js +0 -176
- package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
- package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoDecoder.test.js +0 -675
- package/dist/__tests__/VideoDecoder.test.js.map +0 -1
- package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
- package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoEncoder.test.js +0 -468
- package/dist/__tests__/VideoEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoFrame.test.d.ts +0 -5
- package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
- package/dist/__tests__/VideoFrame.test.js +0 -243
- package/dist/__tests__/VideoFrame.test.js.map +0 -1
- package/dist/__tests__/aac-utils.test.d.ts +0 -2
- package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
- package/dist/__tests__/aac-utils.test.js +0 -37
- package/dist/__tests__/aac-utils.test.js.map +0 -1
- package/dist/__tests__/avc-utils.test.d.ts +0 -2
- package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/avc-utils.test.js +0 -63
- package/dist/__tests__/avc-utils.test.js.map +0 -1
- package/dist/__tests__/hevc-utils.test.d.ts +0 -2
- package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/hevc-utils.test.js +0 -78
- package/dist/__tests__/hevc-utils.test.js.map +0 -1
- package/dist/demos/demo-conversion.d.ts +0 -13
- package/dist/demos/demo-conversion.d.ts.map +0 -1
- package/dist/demos/demo-conversion.js +0 -301
- package/dist/demos/demo-conversion.js.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
- package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.js +0 -161
- package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
- package/dist/demos/demo-mediabunny.d.ts +0 -7
- package/dist/demos/demo-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-mediabunny.js +0 -78
- package/dist/demos/demo-mediabunny.js.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
- package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.js +0 -543
- package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
- package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
- package/dist/ffmpeg/audio-codecs.js.map +0 -1
- package/dist/ffmpeg/formats.d.ts.map +0 -1
- package/dist/ffmpeg/formats.js.map +0 -1
- package/dist/ffmpeg/index.d.ts.map +0 -1
- package/dist/ffmpeg/index.js.map +0 -1
- package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
- package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/annexb.js +0 -201
- package/dist/ffmpeg/parsers/annexb.js.map +0 -1
- package/dist/ffmpeg/parsers/index.d.ts +0 -6
- package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/index.js +0 -8
- package/dist/ffmpeg/parsers/index.js.map +0 -1
- package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
- package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/ivf.js +0 -109
- package/dist/ffmpeg/parsers/ivf.js.map +0 -1
- package/dist/ffmpeg/types.d.ts.map +0 -1
- package/dist/ffmpeg/types.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -23
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +0 -129
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -43
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +0 -220
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -24
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +0 -125
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -48
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +0 -263
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
- package/dist/mediabunny/index.d.ts +0 -21
- package/dist/mediabunny/index.d.ts.map +0 -1
- package/dist/mediabunny/index.js +0 -33
- package/dist/mediabunny/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Demuxer - Extracts encoded chunks from container files (MP4, WebM, MKV)
|
|
3
|
+
*
|
|
4
|
+
* Wraps node-av's Demuxer to provide a WebCodecs-compatible interface that outputs
|
|
5
|
+
* EncodedVideoChunk and EncodedAudioChunk objects.
|
|
6
|
+
*/
|
|
7
|
+
import { Demuxer as NodeAvDemuxer } from 'node-av';
|
|
8
|
+
import { EncodedVideoChunk } from '../core/EncodedVideoChunk.js';
|
|
9
|
+
import { EncodedAudioChunk } from '../core/EncodedAudioChunk.js';
|
|
10
|
+
import { withTimeout, DEFAULT_TIMEOUTS } from '../utils/timeout.js';
|
|
11
|
+
/**
|
|
12
|
+
* Maps FFmpeg codec IDs to WebCodecs codec strings
|
|
13
|
+
*/
|
|
14
|
+
function mapVideoCodecId(codecId, extradata) {
|
|
15
|
+
// Common FFmpeg codec IDs
|
|
16
|
+
switch (codecId) {
|
|
17
|
+
case 27: // AV_CODEC_ID_H264
|
|
18
|
+
// Try to extract profile/level from extradata
|
|
19
|
+
if (extradata && extradata.length >= 4) {
|
|
20
|
+
const profile = extradata[1];
|
|
21
|
+
const constraints = extradata[2];
|
|
22
|
+
const level = extradata[3];
|
|
23
|
+
return `avc1.${profile.toString(16).padStart(2, '0')}${constraints.toString(16).padStart(2, '0')}${level.toString(16).padStart(2, '0')}`;
|
|
24
|
+
}
|
|
25
|
+
return 'avc1.42001E'; // Baseline level 3.0 default
|
|
26
|
+
case 173: // AV_CODEC_ID_HEVC
|
|
27
|
+
return 'hvc1.1.6.L93.B0';
|
|
28
|
+
case 225: // AV_CODEC_ID_VP8
|
|
29
|
+
return 'vp8';
|
|
30
|
+
case 167: // AV_CODEC_ID_VP9
|
|
31
|
+
return 'vp09.00.10.08';
|
|
32
|
+
case 226: // AV_CODEC_ID_AV1
|
|
33
|
+
return 'av01.0.01M.08';
|
|
34
|
+
default:
|
|
35
|
+
return `unknown-${codecId}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function mapAudioCodecId(codecId) {
|
|
39
|
+
switch (codecId) {
|
|
40
|
+
case 86018: // AV_CODEC_ID_AAC
|
|
41
|
+
return 'mp4a.40.2';
|
|
42
|
+
case 86017: // AV_CODEC_ID_MP3
|
|
43
|
+
return 'mp3';
|
|
44
|
+
case 86076: // AV_CODEC_ID_OPUS
|
|
45
|
+
return 'opus';
|
|
46
|
+
case 86028: // AV_CODEC_ID_VORBIS
|
|
47
|
+
return 'vorbis';
|
|
48
|
+
case 86030: // AV_CODEC_ID_FLAC
|
|
49
|
+
return 'flac';
|
|
50
|
+
default:
|
|
51
|
+
return `unknown-${codecId}`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Container demuxer that outputs WebCodecs-compatible chunks
|
|
56
|
+
*/
|
|
57
|
+
export class Demuxer {
|
|
58
|
+
demuxer = null;
|
|
59
|
+
path;
|
|
60
|
+
_videoConfig = null;
|
|
61
|
+
_audioConfig = null;
|
|
62
|
+
_videoStreamIndex = -1;
|
|
63
|
+
_audioStreamIndex = -1;
|
|
64
|
+
_videoTimeBase = null;
|
|
65
|
+
_audioTimeBase = null;
|
|
66
|
+
constructor(config) {
|
|
67
|
+
this.path = config.path;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Open the container file and parse stream information
|
|
71
|
+
*/
|
|
72
|
+
async open(timeout = DEFAULT_TIMEOUTS.open) {
|
|
73
|
+
this.demuxer = await withTimeout(NodeAvDemuxer.open(this.path), timeout, `Demuxer open (${this.path})`);
|
|
74
|
+
// Extract video stream info
|
|
75
|
+
const videoStream = this.demuxer.video();
|
|
76
|
+
if (videoStream) {
|
|
77
|
+
this._videoStreamIndex = videoStream.index;
|
|
78
|
+
this._videoTimeBase = {
|
|
79
|
+
num: videoStream.timeBase.num,
|
|
80
|
+
den: videoStream.timeBase.den,
|
|
81
|
+
};
|
|
82
|
+
const cp = videoStream.codecpar;
|
|
83
|
+
this._videoConfig = {
|
|
84
|
+
codec: mapVideoCodecId(cp.codecId, cp.extradata),
|
|
85
|
+
codedWidth: cp.width,
|
|
86
|
+
codedHeight: cp.height,
|
|
87
|
+
description: cp.extradata ? new Uint8Array(cp.extradata) : undefined,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Extract audio stream info
|
|
91
|
+
const audioStream = this.demuxer.audio();
|
|
92
|
+
if (audioStream) {
|
|
93
|
+
this._audioStreamIndex = audioStream.index;
|
|
94
|
+
this._audioTimeBase = {
|
|
95
|
+
num: audioStream.timeBase.num,
|
|
96
|
+
den: audioStream.timeBase.den,
|
|
97
|
+
};
|
|
98
|
+
const cp = audioStream.codecpar;
|
|
99
|
+
this._audioConfig = {
|
|
100
|
+
codec: mapAudioCodecId(cp.codecId),
|
|
101
|
+
sampleRate: cp.sampleRate,
|
|
102
|
+
numberOfChannels: cp.channels,
|
|
103
|
+
description: cp.extradata ? new Uint8Array(cp.extradata) : undefined,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get video stream configuration (null if no video stream)
|
|
109
|
+
*/
|
|
110
|
+
get videoConfig() {
|
|
111
|
+
return this._videoConfig;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get audio stream configuration (null if no audio stream)
|
|
115
|
+
*/
|
|
116
|
+
get audioConfig() {
|
|
117
|
+
return this._audioConfig;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get container format name (e.g., "mp4", "webm")
|
|
121
|
+
*/
|
|
122
|
+
get format() {
|
|
123
|
+
return this.demuxer?.formatName;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get duration in seconds
|
|
127
|
+
*/
|
|
128
|
+
get duration() {
|
|
129
|
+
return this.demuxer?.duration;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Convert timestamp from stream time base to microseconds
|
|
133
|
+
*/
|
|
134
|
+
toMicroseconds(pts, timeBase) {
|
|
135
|
+
const ptsNum = typeof pts === 'bigint' ? Number(pts) : pts;
|
|
136
|
+
return Math.round((ptsNum * timeBase.num * 1_000_000) / timeBase.den);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Iterate over video chunks
|
|
140
|
+
*/
|
|
141
|
+
async *videoChunks() {
|
|
142
|
+
if (!this.demuxer || this._videoStreamIndex < 0 || !this._videoConfig || !this._videoTimeBase) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
for await (const packet of this.demuxer.packets()) {
|
|
146
|
+
if (!packet || !packet.data)
|
|
147
|
+
continue;
|
|
148
|
+
if (packet.streamIndex === this._videoStreamIndex) {
|
|
149
|
+
const timestamp = this.toMicroseconds(packet.pts, this._videoTimeBase);
|
|
150
|
+
const duration = packet.duration
|
|
151
|
+
? this.toMicroseconds(packet.duration, this._videoTimeBase)
|
|
152
|
+
: undefined;
|
|
153
|
+
const chunk = new EncodedVideoChunk({
|
|
154
|
+
type: packet.isKeyframe ? 'key' : 'delta',
|
|
155
|
+
timestamp,
|
|
156
|
+
duration,
|
|
157
|
+
data: new Uint8Array(packet.data),
|
|
158
|
+
});
|
|
159
|
+
yield chunk;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Iterate over audio chunks
|
|
165
|
+
*/
|
|
166
|
+
async *audioChunks() {
|
|
167
|
+
if (!this.demuxer || this._audioStreamIndex < 0 || !this._audioConfig || !this._audioTimeBase) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
for await (const packet of this.demuxer.packets()) {
|
|
171
|
+
if (!packet || !packet.data)
|
|
172
|
+
continue;
|
|
173
|
+
if (packet.streamIndex === this._audioStreamIndex) {
|
|
174
|
+
const timestamp = this.toMicroseconds(packet.pts, this._audioTimeBase);
|
|
175
|
+
const duration = packet.duration
|
|
176
|
+
? this.toMicroseconds(packet.duration, this._audioTimeBase)
|
|
177
|
+
: undefined;
|
|
178
|
+
const chunk = new EncodedAudioChunk({
|
|
179
|
+
type: packet.isKeyframe ? 'key' : 'delta',
|
|
180
|
+
timestamp,
|
|
181
|
+
duration,
|
|
182
|
+
data: new Uint8Array(packet.data),
|
|
183
|
+
});
|
|
184
|
+
yield chunk;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Iterate over all chunks (video and audio interleaved)
|
|
190
|
+
* Returns both the chunk and its type/config for proper routing
|
|
191
|
+
*/
|
|
192
|
+
async *chunks() {
|
|
193
|
+
if (!this.demuxer) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
for await (const packet of this.demuxer.packets()) {
|
|
197
|
+
if (!packet || !packet.data)
|
|
198
|
+
continue;
|
|
199
|
+
if (packet.streamIndex === this._videoStreamIndex && this._videoConfig && this._videoTimeBase) {
|
|
200
|
+
const timestamp = this.toMicroseconds(packet.pts, this._videoTimeBase);
|
|
201
|
+
const duration = packet.duration
|
|
202
|
+
? this.toMicroseconds(packet.duration, this._videoTimeBase)
|
|
203
|
+
: undefined;
|
|
204
|
+
const chunk = new EncodedVideoChunk({
|
|
205
|
+
type: packet.isKeyframe ? 'key' : 'delta',
|
|
206
|
+
timestamp,
|
|
207
|
+
duration,
|
|
208
|
+
data: new Uint8Array(packet.data),
|
|
209
|
+
});
|
|
210
|
+
yield { type: 'video', chunk, config: this._videoConfig };
|
|
211
|
+
}
|
|
212
|
+
else if (packet.streamIndex === this._audioStreamIndex && this._audioConfig && this._audioTimeBase) {
|
|
213
|
+
const timestamp = this.toMicroseconds(packet.pts, this._audioTimeBase);
|
|
214
|
+
const duration = packet.duration
|
|
215
|
+
? this.toMicroseconds(packet.duration, this._audioTimeBase)
|
|
216
|
+
: undefined;
|
|
217
|
+
const chunk = new EncodedAudioChunk({
|
|
218
|
+
type: packet.isKeyframe ? 'key' : 'delta',
|
|
219
|
+
timestamp,
|
|
220
|
+
duration,
|
|
221
|
+
data: new Uint8Array(packet.data),
|
|
222
|
+
});
|
|
223
|
+
yield { type: 'audio', chunk, config: this._audioConfig };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Demux all chunks with callbacks (alternative API)
|
|
229
|
+
*/
|
|
230
|
+
async demux(options) {
|
|
231
|
+
for await (const item of this.chunks()) {
|
|
232
|
+
if (item.type === 'video' && options.onVideoChunk) {
|
|
233
|
+
options.onVideoChunk(item.chunk, item.config);
|
|
234
|
+
}
|
|
235
|
+
else if (item.type === 'audio' && options.onAudioChunk) {
|
|
236
|
+
options.onAudioChunk(item.chunk, item.config);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Close the demuxer and release resources
|
|
242
|
+
*/
|
|
243
|
+
async close() {
|
|
244
|
+
if (this.demuxer) {
|
|
245
|
+
await this.demuxer.close();
|
|
246
|
+
this.demuxer = null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the underlying node-av demuxer (for advanced use)
|
|
251
|
+
*/
|
|
252
|
+
get native() {
|
|
253
|
+
return this.demuxer;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=Demuxer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Demuxer.js","sourceRoot":"","sources":["../../src/containers/Demuxer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Muxer - Writes encoded chunks to container files (MP4, WebM, MKV)
|
|
3
|
+
*
|
|
4
|
+
* Wraps node-av's Muxer to provide a WebCodecs-compatible interface that accepts
|
|
5
|
+
* EncodedVideoChunk and EncodedAudioChunk objects.
|
|
6
|
+
*/
|
|
7
|
+
import { Muxer as NodeAvMuxer } from 'node-av';
|
|
8
|
+
import { EncodedVideoChunk } from '../core/EncodedVideoChunk.js';
|
|
9
|
+
import { EncodedAudioChunk } from '../core/EncodedAudioChunk.js';
|
|
10
|
+
/**
|
|
11
|
+
* Video track configuration for muxing
|
|
12
|
+
*/
|
|
13
|
+
export interface VideoTrackConfig {
|
|
14
|
+
codec: string;
|
|
15
|
+
codedWidth: number;
|
|
16
|
+
codedHeight: number;
|
|
17
|
+
framerate?: number;
|
|
18
|
+
bitrate?: number;
|
|
19
|
+
description?: Uint8Array;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Audio track configuration for muxing
|
|
23
|
+
*/
|
|
24
|
+
export interface AudioTrackConfig {
|
|
25
|
+
codec: string;
|
|
26
|
+
sampleRate: number;
|
|
27
|
+
numberOfChannels: number;
|
|
28
|
+
bitrate?: number;
|
|
29
|
+
description?: Uint8Array;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Muxer configuration
|
|
33
|
+
*/
|
|
34
|
+
export interface MuxerConfig {
|
|
35
|
+
/** Path to the output file */
|
|
36
|
+
path: string;
|
|
37
|
+
/** Container format (mp4, webm, mkv) - inferred from extension if not specified */
|
|
38
|
+
format?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Container muxer that accepts WebCodecs-compatible chunks
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const muxer = new Muxer({ path: 'output.mp4' });
|
|
46
|
+
* await muxer.open();
|
|
47
|
+
* await muxer.addVideoTrack({
|
|
48
|
+
* codec: 'avc1.42001E',
|
|
49
|
+
* codedWidth: 640,
|
|
50
|
+
* codedHeight: 480,
|
|
51
|
+
* framerate: 30,
|
|
52
|
+
* description: spsNaluBuffer, // Optional: H.264 SPS/PPS
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* // Write encoded chunks from VideoEncoder
|
|
56
|
+
* encoder.configure({ codec: 'avc1.42001E', ... });
|
|
57
|
+
* encoder.encode(frame);
|
|
58
|
+
* // In output callback:
|
|
59
|
+
* await muxer.writeVideoChunk(chunk);
|
|
60
|
+
*
|
|
61
|
+
* await muxer.close();
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class Muxer {
|
|
65
|
+
private muxer;
|
|
66
|
+
private config;
|
|
67
|
+
private _videoStreamIndex;
|
|
68
|
+
private _audioStreamIndex;
|
|
69
|
+
private _videoEncoder;
|
|
70
|
+
private _audioEncoder;
|
|
71
|
+
private _videoConfig;
|
|
72
|
+
private _audioConfig;
|
|
73
|
+
private _videoChunkCount;
|
|
74
|
+
private _audioChunkCount;
|
|
75
|
+
constructor(config: MuxerConfig);
|
|
76
|
+
/**
|
|
77
|
+
* Open the muxer for writing
|
|
78
|
+
*
|
|
79
|
+
* @param timeout - Operation timeout in milliseconds (default: 15000)
|
|
80
|
+
*/
|
|
81
|
+
open(timeout?: number): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Add a video track to the output
|
|
84
|
+
*
|
|
85
|
+
* @param config - Video track configuration
|
|
86
|
+
* @returns Stream index for the video track
|
|
87
|
+
*/
|
|
88
|
+
addVideoTrack(config: VideoTrackConfig): Promise<number>;
|
|
89
|
+
/**
|
|
90
|
+
* Add an audio track to the output
|
|
91
|
+
*
|
|
92
|
+
* @param config - Audio track configuration
|
|
93
|
+
* @returns Stream index for the audio track
|
|
94
|
+
*/
|
|
95
|
+
addAudioTrack(config: AudioTrackConfig): Promise<number>;
|
|
96
|
+
/**
|
|
97
|
+
* Write an encoded video chunk to the output container
|
|
98
|
+
*
|
|
99
|
+
* @param chunk - EncodedVideoChunk from VideoEncoder
|
|
100
|
+
*/
|
|
101
|
+
writeVideoChunk(chunk: EncodedVideoChunk): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Write an encoded audio chunk to the output container
|
|
104
|
+
*
|
|
105
|
+
* @param chunk - EncodedAudioChunk from AudioEncoder
|
|
106
|
+
*/
|
|
107
|
+
writeAudioChunk(chunk: EncodedAudioChunk): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Finalize and close the muxer
|
|
110
|
+
*
|
|
111
|
+
* @param timeout - Operation timeout in milliseconds (default: 10000)
|
|
112
|
+
*/
|
|
113
|
+
close(timeout?: number): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Get the underlying node-av muxer (for advanced use)
|
|
116
|
+
*/
|
|
117
|
+
get native(): NodeAvMuxer | null;
|
|
118
|
+
/**
|
|
119
|
+
* Get number of video chunks written
|
|
120
|
+
*/
|
|
121
|
+
get videoChunkCount(): number;
|
|
122
|
+
/**
|
|
123
|
+
* Get number of audio chunks written
|
|
124
|
+
*/
|
|
125
|
+
get audioChunkCount(): number;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Helper class for stream copy (remux) operations
|
|
129
|
+
* This copies encoded data from one container to another without re-encoding
|
|
130
|
+
*/
|
|
131
|
+
export declare class StreamCopier {
|
|
132
|
+
private srcDemuxer;
|
|
133
|
+
private dstMuxer;
|
|
134
|
+
/**
|
|
135
|
+
* Remux a file from one container format to another
|
|
136
|
+
* This performs a stream copy without re-encoding
|
|
137
|
+
*/
|
|
138
|
+
static remux(inputPath: string, outputPath: string, options?: {
|
|
139
|
+
format?: string;
|
|
140
|
+
}): Promise<void>;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=Muxer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Muxer.d.ts","sourceRoot":"","sources":["../../src/containers/Muxer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,IAAI,WAAW,EAerB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6DD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,MAAM,EAAE,WAAW;IAI/B;;;;OAIG;IACG,IAAI,CAAC,OAAO,GAAE,MAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B9D;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB9D;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9D;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9D;;;;OAIG;IACG,KAAK,CAAC,OAAO,GAAE,MAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpE;;OAEG;IACH,IAAI,MAAM,IAAI,WAAW,GAAG,IAAI,CAE/B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;CACF;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAA4B;IAE5C;;;OAGG;WACU,KAAK,CAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5B,OAAO,CAAC,IAAI,CAAC;CAiCjB"}
|