webcodecs-node 0.2.2 → 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.
- package/README.md +4 -0
- package/dist/__tests__/AudioData.test.js +2 -1
- package/dist/__tests__/AudioData.test.js.map +1 -1
- package/dist/__tests__/AudioDecoder.test.js +8 -8
- package/dist/__tests__/AudioDecoder.test.js.map +1 -1
- package/dist/__tests__/AudioEncoder.test.js +3 -3
- package/dist/__tests__/AudioEncoder.test.js.map +1 -1
- package/dist/__tests__/EncodedChunks.test.js +3 -2
- package/dist/__tests__/EncodedChunks.test.js.map +1 -1
- package/dist/__tests__/HardwareAcceleration.test.js +2 -1
- package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.test.js +16 -45
- package/dist/__tests__/ImageDecoder.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +8 -0
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +1 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js +135 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.js +206 -0
- package/dist/__tests__/NodeAvDecoder.test.js.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.js +176 -0
- package/dist/__tests__/NodeAvEncoder.test.js.map +1 -0
- package/dist/__tests__/VideoDecoder.test.js +5 -5
- package/dist/__tests__/VideoDecoder.test.js.map +1 -1
- package/dist/__tests__/VideoEncoder.test.js +3 -3
- package/dist/__tests__/VideoEncoder.test.js.map +1 -1
- package/dist/__tests__/VideoFrame.test.js +4 -1
- package/dist/__tests__/VideoFrame.test.js.map +1 -1
- package/dist/backends/index.d.ts +3 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +2 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/types.d.ts +168 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +25 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/codec-utils/audio-codecs.d.ts +60 -0
- package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
- package/dist/codec-utils/audio-codecs.js +117 -0
- package/dist/codec-utils/audio-codecs.js.map +1 -0
- package/dist/codec-utils/formats.d.ts +42 -0
- package/dist/codec-utils/formats.d.ts.map +1 -0
- package/dist/codec-utils/formats.js +147 -0
- package/dist/codec-utils/formats.js.map +1 -0
- package/dist/codec-utils/index.d.ts +9 -0
- package/dist/codec-utils/index.d.ts.map +1 -0
- package/dist/codec-utils/index.js +12 -0
- package/dist/codec-utils/index.js.map +1 -0
- package/dist/codec-utils/types.d.ts +87 -0
- package/dist/codec-utils/types.d.ts.map +1 -0
- package/dist/codec-utils/types.js +10 -0
- 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 +5 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +69 -13
- 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 +31 -11
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +244 -81
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +14 -12
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +113 -173
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +1 -3
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +39 -192
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +14 -13
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +115 -166
- 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-conversion.js +2 -2
- package/dist/demos/demo-conversion.js.map +1 -1
- package/dist/demos/demo-four-corners.d.ts +6 -0
- package/dist/demos/demo-four-corners.d.ts.map +1 -0
- package/dist/demos/demo-four-corners.js +218 -0
- package/dist/demos/demo-four-corners.js.map +1 -0
- package/dist/demos/demo-hwaccel-conversion.js +1 -1
- package/dist/demos/demo-hwaccel-conversion.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 +232 -68
- 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 +14 -13
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +138 -228
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +13 -14
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +92 -161
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/ffmpeg/index.d.ts +3 -2
- package/dist/ffmpeg/index.d.ts.map +1 -1
- package/dist/ffmpeg/index.js +3 -3
- package/dist/ffmpeg/index.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 +17 -0
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +144 -10
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +2 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +4 -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/detection.d.ts +1 -1
- package/dist/hardware/detection.d.ts.map +1 -1
- package/dist/hardware/detection.js +54 -27
- package/dist/hardware/detection.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/mediabunny/FFmpegAudioDecoder.d.ts +4 -17
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +57 -185
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +6 -39
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +66 -329
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +5 -38
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +39 -283
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +9 -37
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +49 -336
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
- package/dist/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/node-av/HardwarePipeline.js +243 -0
- package/dist/node-av/HardwarePipeline.js.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.js +350 -0
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts +50 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.js +506 -0
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts +114 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.js +406 -0
- package/dist/node-av/NodeAvImageDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts +43 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.js +365 -0
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts +56 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.js +509 -0
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -0
- 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/event-target.d.ts +42 -0
- package/dist/utils/event-target.d.ts.map +1 -0
- package/dist/utils/event-target.js +96 -0
- package/dist/utils/event-target.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 +6 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +12 -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 +20 -34
|
@@ -1,141 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Mediabunny AudioEncoder adapter using node-av backend
|
|
3
3
|
*
|
|
4
|
-
* Implements Mediabunny's CustomAudioEncoder interface using
|
|
4
|
+
* Implements Mediabunny's CustomAudioEncoder interface using node-av native bindings
|
|
5
|
+
* (which wrap FFmpeg's libav* libraries).
|
|
5
6
|
*/
|
|
6
|
-
import { spawn } from 'child_process';
|
|
7
7
|
import { CustomAudioEncoder, EncodedPacket, } from 'mediabunny';
|
|
8
|
+
import { NodeAvAudioEncoder } from '../node-av/NodeAvAudioEncoder.js';
|
|
8
9
|
import { buildAudioSpecificConfig } from '../utils/aac.js';
|
|
9
|
-
//
|
|
10
|
-
const
|
|
10
|
+
// Map Mediabunny codec to internal codec name
|
|
11
|
+
const CODEC_NAME_MAP = {
|
|
11
12
|
'aac': 'aac',
|
|
12
|
-
'opus': '
|
|
13
|
-
'mp3': '
|
|
13
|
+
'opus': 'opus',
|
|
14
|
+
'mp3': 'mp3',
|
|
14
15
|
'flac': 'flac',
|
|
15
|
-
'vorbis': '
|
|
16
|
-
'pcm-s16': '
|
|
17
|
-
'pcm-s16be': '
|
|
18
|
-
'pcm-s24': '
|
|
19
|
-
'pcm-s24be': '
|
|
20
|
-
'pcm-s32': '
|
|
21
|
-
'pcm-s32be': '
|
|
22
|
-
'pcm-f32': '
|
|
23
|
-
'pcm-f32be': '
|
|
24
|
-
'pcm-f64': '
|
|
25
|
-
'pcm-f64be': '
|
|
26
|
-
'pcm-u8': '
|
|
27
|
-
'pcm-s8': '
|
|
28
|
-
'ulaw': '
|
|
29
|
-
'alaw': '
|
|
30
|
-
};
|
|
31
|
-
// Output container format for each codec
|
|
32
|
-
// Using formats that allow easy frame parsing
|
|
33
|
-
const FORMAT_MAP = {
|
|
34
|
-
'aac': 'adts',
|
|
35
|
-
'libopus': 'opus', // Use raw opus format (OggS pages with single packets)
|
|
36
|
-
'libmp3lame': 'mp3',
|
|
37
|
-
'flac': 'flac',
|
|
38
|
-
'libvorbis': 'ogg',
|
|
39
|
-
'pcm_s16le': 's16le',
|
|
40
|
-
'pcm_s16be': 's16be',
|
|
41
|
-
'pcm_s24le': 's24le',
|
|
42
|
-
'pcm_s24be': 's24be',
|
|
43
|
-
'pcm_s32le': 's32le',
|
|
44
|
-
'pcm_s32be': 's32be',
|
|
45
|
-
'pcm_f32le': 'f32le',
|
|
46
|
-
'pcm_f32be': 'f32be',
|
|
47
|
-
'pcm_f64le': 'f64le',
|
|
48
|
-
'pcm_f64be': 'f64be',
|
|
49
|
-
'pcm_u8': 'u8',
|
|
50
|
-
'pcm_s8': 's8',
|
|
51
|
-
'pcm_mulaw': 'mulaw',
|
|
52
|
-
'pcm_alaw': 'alaw',
|
|
16
|
+
'vorbis': 'vorbis',
|
|
17
|
+
'pcm-s16': 'pcm-s16',
|
|
18
|
+
'pcm-s16be': 'pcm-s16',
|
|
19
|
+
'pcm-s24': 'pcm-s16',
|
|
20
|
+
'pcm-s24be': 'pcm-s16',
|
|
21
|
+
'pcm-s32': 'pcm-s16',
|
|
22
|
+
'pcm-s32be': 'pcm-s16',
|
|
23
|
+
'pcm-f32': 'pcm-f32',
|
|
24
|
+
'pcm-f32be': 'pcm-f32',
|
|
25
|
+
'pcm-f64': 'pcm-f32',
|
|
26
|
+
'pcm-f64be': 'pcm-f32',
|
|
27
|
+
'pcm-u8': 'pcm-s16',
|
|
28
|
+
'pcm-s8': 'pcm-s16',
|
|
29
|
+
'ulaw': 'pcm-s16',
|
|
30
|
+
'alaw': 'pcm-s16',
|
|
53
31
|
};
|
|
54
32
|
export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
55
|
-
|
|
56
|
-
accumulatedData = Buffer.alloc(0);
|
|
33
|
+
backend = null;
|
|
57
34
|
frameIndex = 0;
|
|
58
35
|
resolveFlush = null;
|
|
59
|
-
ffmpegCodec = '';
|
|
60
36
|
metadataEmitted = false;
|
|
61
37
|
codecDescription = null;
|
|
62
|
-
audioOutputFormat = 'adts';
|
|
63
38
|
static supports(codec, _config) {
|
|
64
|
-
return codec in
|
|
39
|
+
return codec in CODEC_NAME_MAP;
|
|
65
40
|
}
|
|
66
41
|
async init() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.
|
|
75
|
-
}
|
|
76
|
-
const args = [
|
|
77
|
-
'-hide_banner',
|
|
78
|
-
'-loglevel', 'error',
|
|
79
|
-
// Input: raw PCM from pipe
|
|
80
|
-
'-f', 'f32le',
|
|
81
|
-
'-ar', String(this.config.sampleRate),
|
|
82
|
-
'-ac', String(this.config.numberOfChannels),
|
|
83
|
-
'-i', 'pipe:0',
|
|
84
|
-
// Output encoder
|
|
85
|
-
'-c:a', this.ffmpegCodec,
|
|
86
|
-
];
|
|
87
|
-
// Add bitrate if specified
|
|
88
|
-
if (this.config.bitrate) {
|
|
89
|
-
args.push('-b:a', String(this.config.bitrate));
|
|
90
|
-
}
|
|
91
|
-
// Codec-specific options
|
|
92
|
-
if (this.ffmpegCodec === 'libopus') {
|
|
93
|
-
args.push('-application', 'audio');
|
|
94
|
-
}
|
|
95
|
-
// Output format
|
|
96
|
-
args.push('-f', format);
|
|
97
|
-
args.push('pipe:1');
|
|
98
|
-
this.process = spawn('ffmpeg', args, {
|
|
99
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
42
|
+
// Create node-av backend
|
|
43
|
+
this.backend = new NodeAvAudioEncoder();
|
|
44
|
+
const codecName = CODEC_NAME_MAP[this.codec] || 'aac';
|
|
45
|
+
this.backend.startEncoder({
|
|
46
|
+
codec: codecName,
|
|
47
|
+
sampleRate: this.config.sampleRate,
|
|
48
|
+
numberOfChannels: this.config.numberOfChannels,
|
|
49
|
+
bitrate: this.config.bitrate,
|
|
100
50
|
});
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
this.
|
|
51
|
+
// Listen for encoded frames
|
|
52
|
+
this.backend.on('encodedFrame', (frame) => {
|
|
53
|
+
this.emitPacket(frame.data);
|
|
104
54
|
});
|
|
105
|
-
this.
|
|
106
|
-
|
|
107
|
-
if (!msg.includes('Discarding')) {
|
|
108
|
-
console.error('FFmpeg audio encoder:', msg);
|
|
109
|
-
}
|
|
55
|
+
this.backend.on('error', (err) => {
|
|
56
|
+
console.error('[FFmpegAudioEncoder] Backend error:', err.message);
|
|
110
57
|
});
|
|
111
|
-
this.
|
|
112
|
-
// Emit remaining data
|
|
113
|
-
if (this.accumulatedData.length > 0) {
|
|
114
|
-
this.emitPacket(this.accumulatedData);
|
|
115
|
-
this.accumulatedData = Buffer.alloc(0);
|
|
116
|
-
}
|
|
58
|
+
this.backend.on('close', () => {
|
|
117
59
|
if (this.resolveFlush) {
|
|
118
60
|
this.resolveFlush();
|
|
119
61
|
this.resolveFlush = null;
|
|
120
62
|
}
|
|
121
63
|
});
|
|
122
|
-
this.process.stdin?.on('error', () => {
|
|
123
|
-
// Ignore EPIPE
|
|
124
|
-
});
|
|
125
64
|
}
|
|
126
65
|
async encode(audioSample) {
|
|
127
|
-
if (!this.
|
|
66
|
+
if (!this.backend?.isHealthy) {
|
|
128
67
|
throw new Error('Encoder not initialized');
|
|
129
68
|
}
|
|
130
69
|
// Get raw PCM data from AudioSample (f32 interleaved)
|
|
131
70
|
const pcmData = await this.getSampleData(audioSample);
|
|
132
|
-
this.
|
|
71
|
+
this.backend.write(pcmData);
|
|
133
72
|
}
|
|
134
73
|
async flush() {
|
|
135
74
|
return new Promise((resolve) => {
|
|
136
75
|
this.resolveFlush = resolve;
|
|
137
|
-
if (this.
|
|
138
|
-
this.
|
|
76
|
+
if (this.backend) {
|
|
77
|
+
this.backend.end();
|
|
139
78
|
}
|
|
140
79
|
else {
|
|
141
80
|
resolve();
|
|
@@ -143,9 +82,9 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
143
82
|
});
|
|
144
83
|
}
|
|
145
84
|
async close() {
|
|
146
|
-
if (this.
|
|
147
|
-
this.
|
|
148
|
-
this.
|
|
85
|
+
if (this.backend) {
|
|
86
|
+
this.backend.kill();
|
|
87
|
+
this.backend = null;
|
|
149
88
|
}
|
|
150
89
|
}
|
|
151
90
|
/**
|
|
@@ -180,174 +119,22 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
180
119
|
return buffer;
|
|
181
120
|
}
|
|
182
121
|
/**
|
|
183
|
-
*
|
|
184
|
-
*/
|
|
185
|
-
parseEncodedFrames() {
|
|
186
|
-
const minChunkSize = 64;
|
|
187
|
-
while (this.accumulatedData.length >= minChunkSize) {
|
|
188
|
-
let frameEnd = this.findFrameEnd();
|
|
189
|
-
if (frameEnd > 0) {
|
|
190
|
-
const frameData = Buffer.from(this.accumulatedData.subarray(0, frameEnd));
|
|
191
|
-
this.accumulatedData = this.accumulatedData.subarray(frameEnd);
|
|
192
|
-
this.emitPacket(frameData);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Find the end of an audio frame
|
|
201
|
-
*/
|
|
202
|
-
findFrameEnd() {
|
|
203
|
-
if (this.ffmpegCodec === 'aac') {
|
|
204
|
-
return this.findADTSFrame();
|
|
205
|
-
}
|
|
206
|
-
else if (this.ffmpegCodec === 'libmp3lame') {
|
|
207
|
-
return this.findMP3Frame();
|
|
208
|
-
}
|
|
209
|
-
else if (this.ffmpegCodec === 'libopus' || this.ffmpegCodec === 'libvorbis') {
|
|
210
|
-
return this.findOggPage();
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
return Math.min(this.accumulatedData.length, 4096);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
findADTSFrame() {
|
|
217
|
-
if (this.accumulatedData.length < 7)
|
|
218
|
-
return 0;
|
|
219
|
-
if ((this.accumulatedData[0] !== 0xFF) ||
|
|
220
|
-
((this.accumulatedData[1] & 0xF0) !== 0xF0)) {
|
|
221
|
-
for (let i = 1; i < this.accumulatedData.length - 1; i++) {
|
|
222
|
-
if (this.accumulatedData[i] === 0xFF &&
|
|
223
|
-
(this.accumulatedData[i + 1] & 0xF0) === 0xF0) {
|
|
224
|
-
this.accumulatedData = this.accumulatedData.subarray(i);
|
|
225
|
-
return 0;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return 0;
|
|
229
|
-
}
|
|
230
|
-
const frameLength = ((this.accumulatedData[3] & 0x03) << 11) |
|
|
231
|
-
(this.accumulatedData[4] << 3) |
|
|
232
|
-
((this.accumulatedData[5] & 0xE0) >> 5);
|
|
233
|
-
if (frameLength > this.accumulatedData.length)
|
|
234
|
-
return 0;
|
|
235
|
-
return frameLength;
|
|
236
|
-
}
|
|
237
|
-
findMP3Frame() {
|
|
238
|
-
if (this.accumulatedData.length < 4)
|
|
239
|
-
return 0;
|
|
240
|
-
if (this.accumulatedData[0] !== 0xFF ||
|
|
241
|
-
(this.accumulatedData[1] & 0xE0) !== 0xE0) {
|
|
242
|
-
for (let i = 1; i < this.accumulatedData.length - 1; i++) {
|
|
243
|
-
if (this.accumulatedData[i] === 0xFF &&
|
|
244
|
-
(this.accumulatedData[i + 1] & 0xE0) === 0xE0) {
|
|
245
|
-
this.accumulatedData = this.accumulatedData.subarray(i);
|
|
246
|
-
return 0;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return 0;
|
|
250
|
-
}
|
|
251
|
-
const header = this.accumulatedData.readUInt32BE(0);
|
|
252
|
-
const bitrateIndex = (header >> 12) & 0x0F;
|
|
253
|
-
const samplingRateIndex = (header >> 10) & 0x03;
|
|
254
|
-
const padding = (header >> 9) & 0x01;
|
|
255
|
-
const bitrates = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0];
|
|
256
|
-
const sampleRates = [44100, 48000, 32000, 0];
|
|
257
|
-
const bitrate = bitrates[bitrateIndex] * 1000;
|
|
258
|
-
const sampleRate = sampleRates[samplingRateIndex];
|
|
259
|
-
if (bitrate === 0 || sampleRate === 0)
|
|
260
|
-
return 0;
|
|
261
|
-
const frameSize = Math.floor((144 * bitrate) / sampleRate) + padding;
|
|
262
|
-
if (frameSize > this.accumulatedData.length)
|
|
263
|
-
return 0;
|
|
264
|
-
return frameSize;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Parse Ogg pages and extract individual Opus packets
|
|
268
|
-
* Ogg page structure:
|
|
269
|
-
* - 4 bytes: "OggS" magic
|
|
270
|
-
* - 1 byte: version
|
|
271
|
-
* - 1 byte: header type
|
|
272
|
-
* - 8 bytes: granule position
|
|
273
|
-
* - 4 bytes: serial number
|
|
274
|
-
* - 4 bytes: page sequence number
|
|
275
|
-
* - 4 bytes: checksum
|
|
276
|
-
* - 1 byte: number of segments
|
|
277
|
-
* - N bytes: segment table (one byte per segment)
|
|
278
|
-
* - data: concatenated segments
|
|
279
|
-
*/
|
|
280
|
-
findOggPage() {
|
|
281
|
-
if (this.accumulatedData.length < 27)
|
|
282
|
-
return 0;
|
|
283
|
-
if (this.accumulatedData.toString('ascii', 0, 4) !== 'OggS') {
|
|
284
|
-
for (let i = 1; i < this.accumulatedData.length - 3; i++) {
|
|
285
|
-
if (this.accumulatedData.toString('ascii', i, i + 4) === 'OggS') {
|
|
286
|
-
this.accumulatedData = this.accumulatedData.subarray(i);
|
|
287
|
-
return 0;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return this.accumulatedData.length;
|
|
291
|
-
}
|
|
292
|
-
const numSegments = this.accumulatedData[26];
|
|
293
|
-
if (this.accumulatedData.length < 27 + numSegments)
|
|
294
|
-
return 0;
|
|
295
|
-
// Calculate total page size
|
|
296
|
-
let pageDataSize = 0;
|
|
297
|
-
for (let i = 0; i < numSegments; i++) {
|
|
298
|
-
pageDataSize += this.accumulatedData[27 + i];
|
|
299
|
-
}
|
|
300
|
-
const headerSize = 27 + numSegments;
|
|
301
|
-
const pageSize = headerSize + pageDataSize;
|
|
302
|
-
if (pageSize > this.accumulatedData.length)
|
|
303
|
-
return 0;
|
|
304
|
-
// Skip header pages (OpusHead, OpusTags)
|
|
305
|
-
const pageData = this.accumulatedData.subarray(headerSize, pageSize);
|
|
306
|
-
if (pageData.length >= 8) {
|
|
307
|
-
const magic = pageData.toString('ascii', 0, 8);
|
|
308
|
-
if (magic === 'OpusHead' || magic === 'OpusTags') {
|
|
309
|
-
// Skip this header page, return the page size to advance past it
|
|
310
|
-
this.accumulatedData = this.accumulatedData.subarray(pageSize);
|
|
311
|
-
return 0; // Return 0 to continue parsing
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
// Extract individual Opus packets from segments
|
|
315
|
-
// In Ogg, a packet ends when a segment is < 255 bytes
|
|
316
|
-
// Multiple packets can be in one page
|
|
317
|
-
this.extractOggPackets(headerSize, numSegments);
|
|
318
|
-
// Remove the processed page
|
|
319
|
-
this.accumulatedData = this.accumulatedData.subarray(pageSize);
|
|
320
|
-
return 0; // We've already emitted packets, return 0 to continue
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Extract individual Opus packets from Ogg page segments
|
|
122
|
+
* Get the number of samples per frame based on codec
|
|
324
123
|
*/
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
this.emitPacket(packet);
|
|
340
|
-
}
|
|
341
|
-
packetData = [];
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// Handle any remaining data (packet spanning pages)
|
|
346
|
-
if (packetData.length > 0) {
|
|
347
|
-
const packet = Buffer.concat(packetData);
|
|
348
|
-
if (packet.length > 0) {
|
|
349
|
-
this.emitPacket(packet);
|
|
350
|
-
}
|
|
124
|
+
getFrameSamples() {
|
|
125
|
+
switch (this.codec) {
|
|
126
|
+
case 'opus':
|
|
127
|
+
return 960;
|
|
128
|
+
case 'aac':
|
|
129
|
+
return 1024;
|
|
130
|
+
case 'mp3':
|
|
131
|
+
return 1152;
|
|
132
|
+
case 'vorbis':
|
|
133
|
+
return 1024;
|
|
134
|
+
case 'flac':
|
|
135
|
+
return 4096;
|
|
136
|
+
default:
|
|
137
|
+
return 1024;
|
|
351
138
|
}
|
|
352
139
|
}
|
|
353
140
|
/**
|
|
@@ -355,19 +142,13 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
355
142
|
*/
|
|
356
143
|
emitPacket(data) {
|
|
357
144
|
const sampleRate = this.config.sampleRate;
|
|
358
|
-
// Get frame size based on codec
|
|
359
145
|
const frameSamples = this.getFrameSamples();
|
|
360
146
|
const timestampSeconds = this.frameIndex / sampleRate;
|
|
361
147
|
const durationSeconds = frameSamples / sampleRate;
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
payload = this.stripAdtsHeader(data);
|
|
365
|
-
}
|
|
366
|
-
const packet = new EncodedPacket(new Uint8Array(payload), 'key', timestampSeconds, durationSeconds);
|
|
367
|
-
// Build metadata with decoder config (required by Mediabunny)
|
|
148
|
+
const packet = new EncodedPacket(new Uint8Array(data), 'key', timestampSeconds, durationSeconds);
|
|
149
|
+
// Build metadata with decoder config
|
|
368
150
|
let meta;
|
|
369
151
|
if (!this.metadataEmitted) {
|
|
370
|
-
// Build codec description based on codec type
|
|
371
152
|
if (!this.codecDescription) {
|
|
372
153
|
if (this.codec === 'opus') {
|
|
373
154
|
this.codecDescription = this.buildOpusDescription();
|
|
@@ -389,37 +170,13 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
389
170
|
this.frameIndex += frameSamples;
|
|
390
171
|
this.onPacket(packet, meta);
|
|
391
172
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Get the number of samples per frame based on codec
|
|
394
|
-
*/
|
|
395
|
-
getFrameSamples() {
|
|
396
|
-
switch (this.codec) {
|
|
397
|
-
case 'opus':
|
|
398
|
-
// Opus typically uses 20ms frames at 48kHz = 960 samples
|
|
399
|
-
return 960;
|
|
400
|
-
case 'aac':
|
|
401
|
-
// AAC uses 1024 samples per frame
|
|
402
|
-
return 1024;
|
|
403
|
-
case 'mp3':
|
|
404
|
-
// MP3 uses 1152 samples per frame
|
|
405
|
-
return 1152;
|
|
406
|
-
case 'vorbis':
|
|
407
|
-
// Vorbis frame size varies, use approximate average
|
|
408
|
-
return 1024;
|
|
409
|
-
case 'flac':
|
|
410
|
-
// FLAC frame size varies, use approximate
|
|
411
|
-
return 4096;
|
|
412
|
-
default:
|
|
413
|
-
return 1024;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
173
|
/**
|
|
417
174
|
* Get codec string for the output format
|
|
418
175
|
*/
|
|
419
176
|
getCodecString() {
|
|
420
177
|
switch (this.codec) {
|
|
421
178
|
case 'aac':
|
|
422
|
-
return 'mp4a.40.2';
|
|
179
|
+
return 'mp4a.40.2';
|
|
423
180
|
case 'opus':
|
|
424
181
|
return 'opus';
|
|
425
182
|
case 'mp3':
|
|
@@ -436,32 +193,23 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
436
193
|
* Build Opus identification header for decoder config description
|
|
437
194
|
*/
|
|
438
195
|
buildOpusDescription() {
|
|
439
|
-
// Opus Identification Header (19 bytes minimum)
|
|
440
196
|
const header = Buffer.alloc(19);
|
|
441
197
|
let offset = 0;
|
|
442
|
-
// Magic signature "OpusHead"
|
|
443
198
|
header.write('OpusHead', offset);
|
|
444
199
|
offset += 8;
|
|
445
|
-
// Version (1 byte)
|
|
446
200
|
header[offset++] = 1;
|
|
447
|
-
// Channel count (1 byte)
|
|
448
201
|
header[offset++] = this.config.numberOfChannels;
|
|
449
|
-
|
|
450
|
-
header.writeUInt16LE(312, offset); // Default pre-skip
|
|
202
|
+
header.writeUInt16LE(312, offset);
|
|
451
203
|
offset += 2;
|
|
452
|
-
// Input sample rate (4 bytes, little-endian)
|
|
453
204
|
header.writeUInt32LE(this.config.sampleRate, offset);
|
|
454
205
|
offset += 4;
|
|
455
|
-
// Output gain (2 bytes, little-endian)
|
|
456
206
|
header.writeInt16LE(0, offset);
|
|
457
207
|
offset += 2;
|
|
458
|
-
|
|
459
|
-
header[offset++] = 0; // 0 = mono/stereo, no mapping table
|
|
208
|
+
header[offset++] = 0;
|
|
460
209
|
return new Uint8Array(header);
|
|
461
210
|
}
|
|
462
211
|
/**
|
|
463
212
|
* Build AAC AudioSpecificConfig for decoder config description
|
|
464
|
-
* ISO 14496-3 section 1.6.2.1
|
|
465
213
|
*/
|
|
466
214
|
buildAacDescription() {
|
|
467
215
|
return buildAudioSpecificConfig({
|
|
@@ -469,16 +217,5 @@ export class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
469
217
|
channelConfiguration: this.config.numberOfChannels,
|
|
470
218
|
});
|
|
471
219
|
}
|
|
472
|
-
stripAdtsHeader(frame) {
|
|
473
|
-
if (frame.length < 7) {
|
|
474
|
-
return frame;
|
|
475
|
-
}
|
|
476
|
-
const protectionAbsent = frame[1] & 0x01;
|
|
477
|
-
const headerLength = protectionAbsent ? 7 : 9;
|
|
478
|
-
if (frame.length <= headerLength) {
|
|
479
|
-
return Buffer.alloc(0);
|
|
480
|
-
}
|
|
481
|
-
return frame.subarray(headerLength);
|
|
482
|
-
}
|
|
483
220
|
}
|
|
484
221
|
//# sourceMappingURL=FFmpegAudioEncoder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegAudioEncoder.js","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioEncoder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FFmpegAudioEncoder.js","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioEncoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,55 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Mediabunny VideoDecoder adapter using node-av backend
|
|
3
3
|
*
|
|
4
|
-
* Implements Mediabunny's CustomVideoDecoder interface using
|
|
5
|
-
* Supports hardware acceleration via VAAPI,
|
|
4
|
+
* Implements Mediabunny's CustomVideoDecoder interface using node-av native bindings
|
|
5
|
+
* (which wrap FFmpeg's libav* libraries). Supports hardware acceleration via VAAPI,
|
|
6
|
+
* CUDA/CUVID, QSV.
|
|
6
7
|
*/
|
|
7
8
|
import { CustomVideoDecoder, EncodedPacket, VideoCodec } from 'mediabunny';
|
|
8
9
|
export declare class FFmpegVideoDecoder extends CustomVideoDecoder {
|
|
9
|
-
private
|
|
10
|
-
private accumulatedData;
|
|
11
|
-
private frameSize;
|
|
10
|
+
private backend;
|
|
12
11
|
private frameIndex;
|
|
13
|
-
private ivfHeaderSent;
|
|
14
12
|
private resolveFlush;
|
|
15
|
-
private useIvf;
|
|
16
|
-
private useAnnexB;
|
|
17
|
-
private nalLengthSize;
|
|
18
|
-
private spsNal;
|
|
19
|
-
private ppsNal;
|
|
20
|
-
private paramsSent;
|
|
21
13
|
private packetTimestamps;
|
|
22
14
|
private packetDurations;
|
|
23
|
-
private usingHardwareAcceleration;
|
|
24
|
-
private hwaccelMethod;
|
|
25
15
|
static supports(codec: VideoCodec, _config: VideoDecoderConfig): boolean;
|
|
26
16
|
init(): Promise<void>;
|
|
27
17
|
decode(packet: EncodedPacket): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Parse AVCDecoderConfigurationRecord from config.description
|
|
30
|
-
* This extracts SPS and PPS NAL units needed for Annex B stream
|
|
31
|
-
*/
|
|
32
|
-
private parseAvcDecoderConfig;
|
|
33
|
-
/**
|
|
34
|
-
* Convert AVC/AVCC format packet to Annex B and write to FFmpeg
|
|
35
|
-
* AVC format: [length][NAL][length][NAL]...
|
|
36
|
-
* Annex B: [start code][NAL][start code][NAL]...
|
|
37
|
-
*/
|
|
38
|
-
private writeAnnexBFrame;
|
|
39
|
-
/**
|
|
40
|
-
* Check if buffer is already in Annex B format
|
|
41
|
-
*/
|
|
42
|
-
private isAnnexBFormat;
|
|
43
18
|
flush(): Promise<void>;
|
|
44
19
|
close(): Promise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* Write IVF file header (32 bytes)
|
|
47
|
-
*/
|
|
48
|
-
private writeIvfHeader;
|
|
49
|
-
/**
|
|
50
|
-
* Write an IVF frame (12-byte header + data)
|
|
51
|
-
*/
|
|
52
|
-
private writeIvfFrame;
|
|
53
20
|
/**
|
|
54
21
|
* Emit a decoded VideoSample via Mediabunny callback
|
|
55
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegVideoDecoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegVideoDecoder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"FFmpegVideoDecoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegVideoDecoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AAapB,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAgB;IAEvC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAIlE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CrB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,OAAO,CAAC,UAAU;CA8BnB"}
|