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,34 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Mediabunny AudioDecoder adapter using node-av backend
|
|
3
3
|
*
|
|
4
|
-
* Implements Mediabunny's CustomAudioDecoder interface using
|
|
4
|
+
* Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
|
|
5
|
+
* (which wrap FFmpeg's libav* libraries).
|
|
5
6
|
*/
|
|
6
7
|
import { CustomAudioDecoder, EncodedPacket, AudioCodec } from 'mediabunny';
|
|
7
8
|
export declare class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
8
|
-
private
|
|
9
|
-
private accumulatedData;
|
|
9
|
+
private backend;
|
|
10
10
|
private frameIndex;
|
|
11
11
|
private resolveFlush;
|
|
12
|
-
private aacConfig;
|
|
13
12
|
private baseTimestamp;
|
|
14
13
|
private hasBaseTimestamp;
|
|
15
14
|
static supports(codec: AudioCodec, _config: AudioDecoderConfig): boolean;
|
|
16
15
|
init(): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* Parse AAC AudioSpecificConfig from description buffer
|
|
19
|
-
*/
|
|
20
|
-
private parseAacAudioSpecificConfig;
|
|
21
16
|
decode(packet: EncodedPacket): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Wrap raw AAC frame with ADTS header (7 bytes)
|
|
24
|
-
*/
|
|
25
|
-
private wrapWithAdtsHeader;
|
|
26
17
|
flush(): Promise<void>;
|
|
27
18
|
close(): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Emit decoded audio samples
|
|
30
|
-
*/
|
|
31
|
-
private emitDecodedSamples;
|
|
32
19
|
/**
|
|
33
20
|
* Emit an AudioSample via Mediabunny callback
|
|
34
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegAudioDecoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioDecoder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"FFmpegAudioDecoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,gBAAgB,CAAkB;IAE1C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAIlE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCrB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAsBxB"}
|
|
@@ -1,135 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Mediabunny AudioDecoder adapter using node-av backend
|
|
3
3
|
*
|
|
4
|
-
* Implements Mediabunny's CustomAudioDecoder interface using
|
|
4
|
+
* Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
|
|
5
|
+
* (which wrap FFmpeg's libav* libraries).
|
|
5
6
|
*/
|
|
6
|
-
import { spawn } from 'child_process';
|
|
7
7
|
import { CustomAudioDecoder, AudioSample, } from 'mediabunny';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'pcm-
|
|
18
|
-
'pcm-
|
|
19
|
-
'pcm-
|
|
20
|
-
'pcm-
|
|
21
|
-
'pcm-
|
|
22
|
-
'pcm-
|
|
23
|
-
'pcm-
|
|
24
|
-
'pcm-
|
|
25
|
-
'pcm-
|
|
26
|
-
'pcm-
|
|
27
|
-
'
|
|
28
|
-
'
|
|
8
|
+
import { NodeAvAudioDecoder } from '../node-av/NodeAvAudioDecoder.js';
|
|
9
|
+
import { toUint8Array } from '../utils/buffer.js';
|
|
10
|
+
// Map Mediabunny codec to internal codec name
|
|
11
|
+
const CODEC_NAME_MAP = {
|
|
12
|
+
'aac': 'aac',
|
|
13
|
+
'opus': 'opus',
|
|
14
|
+
'mp3': 'mp3',
|
|
15
|
+
'flac': 'flac',
|
|
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',
|
|
29
31
|
};
|
|
30
|
-
// AAC frequency table for ADTS header
|
|
31
|
-
const AAC_FREQUENCIES = [
|
|
32
|
-
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
|
|
33
|
-
16000, 12000, 11025, 8000, 7350
|
|
34
|
-
];
|
|
35
32
|
export class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
36
|
-
|
|
37
|
-
accumulatedData = Buffer.alloc(0);
|
|
33
|
+
backend = null;
|
|
38
34
|
frameIndex = 0;
|
|
39
35
|
resolveFlush = null;
|
|
40
|
-
aacConfig = null;
|
|
41
36
|
// Track base timestamp from first input packet
|
|
42
37
|
baseTimestamp = 0;
|
|
43
38
|
hasBaseTimestamp = false;
|
|
44
39
|
static supports(codec, _config) {
|
|
45
|
-
return codec in
|
|
40
|
+
return codec in CODEC_NAME_MAP;
|
|
46
41
|
}
|
|
47
42
|
async init() {
|
|
48
|
-
const codecInfo = CODEC_MAP[this.codec] || { decoder: 'aac', format: 'aac' };
|
|
49
43
|
const sampleRate = this.config.sampleRate ?? 44100;
|
|
50
44
|
const numberOfChannels = this.config.numberOfChannels ?? 2;
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
// Create node-av backend
|
|
46
|
+
this.backend = new NodeAvAudioDecoder();
|
|
47
|
+
const codecName = CODEC_NAME_MAP[this.codec] || 'aac';
|
|
48
|
+
// Convert description to ArrayBufferView if present
|
|
49
|
+
let description;
|
|
50
|
+
if (this.config.description) {
|
|
51
|
+
description = toUint8Array(this.config.description);
|
|
54
52
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
channelConfig: numberOfChannels,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
// Use 'adts' format for AAC since we'll wrap packets with ADTS headers
|
|
65
|
-
const inputFormat = this.codec === 'aac' ? 'aac' : codecInfo.format;
|
|
66
|
-
const args = [
|
|
67
|
-
'-hide_banner',
|
|
68
|
-
'-loglevel', 'error',
|
|
69
|
-
// Input from pipe
|
|
70
|
-
'-f', inputFormat,
|
|
71
|
-
'-i', 'pipe:0',
|
|
72
|
-
// Output: raw PCM f32le
|
|
73
|
-
'-f', 'f32le',
|
|
74
|
-
'-ar', String(sampleRate),
|
|
75
|
-
'-ac', String(numberOfChannels),
|
|
76
|
-
'pipe:1',
|
|
77
|
-
];
|
|
78
|
-
this.process = spawn('ffmpeg', args, {
|
|
79
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
53
|
+
this.backend.startDecoder({
|
|
54
|
+
codec: codecName,
|
|
55
|
+
sampleRate,
|
|
56
|
+
numberOfChannels,
|
|
57
|
+
description,
|
|
58
|
+
outputFormat: 'f32',
|
|
80
59
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.
|
|
60
|
+
// Listen for decoded frames
|
|
61
|
+
this.backend.on('frame', (frame) => {
|
|
62
|
+
this.emitAudioSample(frame.data, frame.numberOfFrames);
|
|
84
63
|
});
|
|
85
|
-
this.
|
|
86
|
-
|
|
87
|
-
// Ignore common warnings, but log real errors for debugging
|
|
88
|
-
if (!msg.includes('Discarding') && !msg.includes('Last message repeated')) {
|
|
89
|
-
console.error('FFmpeg audio decoder:', msg);
|
|
90
|
-
}
|
|
64
|
+
this.backend.on('error', (err) => {
|
|
65
|
+
console.error('[FFmpegAudioDecoder] Backend error:', err.message);
|
|
91
66
|
});
|
|
92
|
-
this.
|
|
93
|
-
// Emit any remaining samples
|
|
94
|
-
if (this.accumulatedData.length > 0) {
|
|
95
|
-
this.emitAudioSample(this.accumulatedData);
|
|
96
|
-
this.accumulatedData = Buffer.alloc(0);
|
|
97
|
-
}
|
|
67
|
+
this.backend.on('close', () => {
|
|
98
68
|
if (this.resolveFlush) {
|
|
99
69
|
this.resolveFlush();
|
|
100
70
|
this.resolveFlush = null;
|
|
101
71
|
}
|
|
102
72
|
});
|
|
103
|
-
this.process.stdin?.on('error', () => {
|
|
104
|
-
// Ignore EPIPE errors
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Parse AAC AudioSpecificConfig from description buffer
|
|
109
|
-
*/
|
|
110
|
-
parseAacAudioSpecificConfig(description) {
|
|
111
|
-
let data;
|
|
112
|
-
if (description instanceof ArrayBuffer) {
|
|
113
|
-
data = new Uint8Array(description);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
data = new Uint8Array(description.buffer, description.byteOffset, description.byteLength);
|
|
117
|
-
}
|
|
118
|
-
if (data.length < 2) {
|
|
119
|
-
// Default config
|
|
120
|
-
return { objectType: 2, frequencyIndex: 4, channelConfig: 2 };
|
|
121
|
-
}
|
|
122
|
-
// Parse AudioSpecificConfig
|
|
123
|
-
// 5 bits: objectType
|
|
124
|
-
// 4 bits: frequencyIndex
|
|
125
|
-
// 4 bits: channelConfiguration
|
|
126
|
-
const objectType = (data[0] >> 3) & 0x1f;
|
|
127
|
-
const frequencyIndex = ((data[0] & 0x07) << 1) | ((data[1] >> 7) & 0x01);
|
|
128
|
-
const channelConfig = (data[1] >> 3) & 0x0f;
|
|
129
|
-
return { objectType, frequencyIndex, channelConfig };
|
|
130
73
|
}
|
|
131
74
|
async decode(packet) {
|
|
132
|
-
if (!this.
|
|
75
|
+
if (!this.backend?.isHealthy) {
|
|
133
76
|
throw new Error('Decoder not initialized');
|
|
134
77
|
}
|
|
135
78
|
// Capture the base timestamp from the first packet
|
|
@@ -137,65 +80,14 @@ export class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
|
137
80
|
this.baseTimestamp = packet.timestamp;
|
|
138
81
|
this.hasBaseTimestamp = true;
|
|
139
82
|
}
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
const adtsFrame = this.wrapWithAdtsHeader(packet.data);
|
|
143
|
-
this.process.stdin.write(adtsFrame);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// Write encoded data directly to FFmpeg
|
|
147
|
-
this.process.stdin.write(Buffer.from(packet.data));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Wrap raw AAC frame with ADTS header (7 bytes)
|
|
152
|
-
*/
|
|
153
|
-
wrapWithAdtsHeader(rawAac) {
|
|
154
|
-
if (!this.aacConfig) {
|
|
155
|
-
return Buffer.from(rawAac);
|
|
156
|
-
}
|
|
157
|
-
const frameLength = rawAac.length + 7; // 7-byte ADTS header
|
|
158
|
-
const header = Buffer.alloc(7);
|
|
159
|
-
// ADTS header structure (7 bytes, no CRC):
|
|
160
|
-
// Syncword: 12 bits (0xFFF)
|
|
161
|
-
// ID: 1 bit (0 = MPEG-4, 1 = MPEG-2)
|
|
162
|
-
// Layer: 2 bits (always 0)
|
|
163
|
-
// Protection absent: 1 bit (1 = no CRC)
|
|
164
|
-
// Profile: 2 bits (objectType - 1)
|
|
165
|
-
// Sampling frequency index: 4 bits
|
|
166
|
-
// Private bit: 1 bit (0)
|
|
167
|
-
// Channel configuration: 3 bits
|
|
168
|
-
// Original/copy: 1 bit (0)
|
|
169
|
-
// Home: 1 bit (0)
|
|
170
|
-
// Copyright ID bit: 1 bit (0)
|
|
171
|
-
// Copyright ID start: 1 bit (0)
|
|
172
|
-
// Frame length: 13 bits
|
|
173
|
-
// Buffer fullness: 11 bits (0x7FF = variable)
|
|
174
|
-
// Number of AAC frames - 1: 2 bits (0 = 1 frame)
|
|
175
|
-
const profile = this.aacConfig.objectType - 1; // Profile is objectType - 1
|
|
176
|
-
const freqIdx = this.aacConfig.frequencyIndex;
|
|
177
|
-
const chanCfg = this.aacConfig.channelConfig;
|
|
178
|
-
// Byte 0: Syncword high (0xFF)
|
|
179
|
-
header[0] = 0xff;
|
|
180
|
-
// Byte 1: Syncword low (0xF) + ID (0) + Layer (00) + Protection absent (1)
|
|
181
|
-
header[1] = 0xf1; // 0xF0 | 0x01
|
|
182
|
-
// Byte 2: Profile (2 bits) + Frequency index (4 bits) + Private (1 bit) + Channel config high (1 bit)
|
|
183
|
-
header[2] = ((profile & 0x03) << 6) | ((freqIdx & 0x0f) << 2) | ((chanCfg >> 2) & 0x01);
|
|
184
|
-
// Byte 3: Channel config low (2 bits) + Original (1 bit) + Home (1 bit) + Copyright ID (1 bit) + Copyright start (1 bit) + Frame length high (2 bits)
|
|
185
|
-
header[3] = ((chanCfg & 0x03) << 6) | ((frameLength >> 11) & 0x03);
|
|
186
|
-
// Byte 4: Frame length middle (8 bits)
|
|
187
|
-
header[4] = (frameLength >> 3) & 0xff;
|
|
188
|
-
// Byte 5: Frame length low (3 bits) + Buffer fullness high (5 bits)
|
|
189
|
-
header[5] = ((frameLength & 0x07) << 5) | 0x1f; // Buffer fullness = 0x7FF
|
|
190
|
-
// Byte 6: Buffer fullness low (6 bits) + Number of frames - 1 (2 bits)
|
|
191
|
-
header[6] = 0xfc; // (0x3F << 2) | 0x00
|
|
192
|
-
return Buffer.concat([header, Buffer.from(rawAac)]);
|
|
83
|
+
// Write encoded data to backend
|
|
84
|
+
this.backend.write(Buffer.from(packet.data));
|
|
193
85
|
}
|
|
194
86
|
async flush() {
|
|
195
87
|
return new Promise((resolve) => {
|
|
196
88
|
this.resolveFlush = resolve;
|
|
197
|
-
if (this.
|
|
198
|
-
this.
|
|
89
|
+
if (this.backend) {
|
|
90
|
+
this.backend.end();
|
|
199
91
|
}
|
|
200
92
|
else {
|
|
201
93
|
resolve();
|
|
@@ -203,39 +95,19 @@ export class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
|
203
95
|
});
|
|
204
96
|
}
|
|
205
97
|
async close() {
|
|
206
|
-
if (this.
|
|
207
|
-
this.
|
|
208
|
-
this.
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Emit decoded audio samples
|
|
213
|
-
*/
|
|
214
|
-
emitDecodedSamples() {
|
|
215
|
-
const sampleRate = this.config.sampleRate ?? 44100;
|
|
216
|
-
const numberOfChannels = this.config.numberOfChannels ?? 2;
|
|
217
|
-
// Calculate chunk size (emit ~20ms chunks)
|
|
218
|
-
const samplesPerChunk = Math.floor(sampleRate * 0.02); // 20ms
|
|
219
|
-
const bytesPerSample = 4; // f32
|
|
220
|
-
const bytesPerChunk = samplesPerChunk * numberOfChannels * bytesPerSample;
|
|
221
|
-
while (this.accumulatedData.length >= bytesPerChunk) {
|
|
222
|
-
const chunkData = Buffer.from(this.accumulatedData.subarray(0, bytesPerChunk));
|
|
223
|
-
this.accumulatedData = this.accumulatedData.subarray(bytesPerChunk);
|
|
224
|
-
this.emitAudioSample(chunkData);
|
|
98
|
+
if (this.backend) {
|
|
99
|
+
this.backend.kill();
|
|
100
|
+
this.backend = null;
|
|
225
101
|
}
|
|
226
102
|
}
|
|
227
103
|
/**
|
|
228
104
|
* Emit an AudioSample via Mediabunny callback
|
|
229
105
|
*/
|
|
230
|
-
emitAudioSample(data) {
|
|
231
|
-
if (data.length === 0)
|
|
106
|
+
emitAudioSample(data, numberOfFrames) {
|
|
107
|
+
if (data.length === 0 || numberOfFrames === 0)
|
|
232
108
|
return;
|
|
233
109
|
const sampleRate = this.config.sampleRate ?? 44100;
|
|
234
110
|
const numberOfChannels = this.config.numberOfChannels ?? 2;
|
|
235
|
-
const bytesPerSample = 4; // f32
|
|
236
|
-
const numberOfFrames = Math.floor(data.length / (numberOfChannels * bytesPerSample));
|
|
237
|
-
if (numberOfFrames === 0)
|
|
238
|
-
return;
|
|
239
111
|
// Calculate timestamp in seconds, preserving base timestamp from input
|
|
240
112
|
const offsetSeconds = this.frameIndex / sampleRate;
|
|
241
113
|
const timestampSeconds = this.baseTimestamp + offsetSeconds;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegAudioDecoder.js","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioDecoder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"FFmpegAudioDecoder.js","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,16 @@
|
|
|
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
7
|
import { CustomAudioEncoder, AudioSample, AudioCodec } from 'mediabunny';
|
|
7
8
|
export declare class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
8
|
-
private
|
|
9
|
-
private accumulatedData;
|
|
9
|
+
private backend;
|
|
10
10
|
private frameIndex;
|
|
11
11
|
private resolveFlush;
|
|
12
|
-
private ffmpegCodec;
|
|
13
12
|
private metadataEmitted;
|
|
14
13
|
private codecDescription;
|
|
15
|
-
private audioOutputFormat;
|
|
16
14
|
static supports(codec: AudioCodec, _config: AudioEncoderConfig): boolean;
|
|
17
15
|
init(): Promise<void>;
|
|
18
16
|
encode(audioSample: AudioSample): Promise<void>;
|
|
@@ -23,42 +21,13 @@ export declare class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
23
21
|
*/
|
|
24
22
|
private getSampleData;
|
|
25
23
|
/**
|
|
26
|
-
*
|
|
27
|
-
*/
|
|
28
|
-
private parseEncodedFrames;
|
|
29
|
-
/**
|
|
30
|
-
* Find the end of an audio frame
|
|
31
|
-
*/
|
|
32
|
-
private findFrameEnd;
|
|
33
|
-
private findADTSFrame;
|
|
34
|
-
private findMP3Frame;
|
|
35
|
-
/**
|
|
36
|
-
* Parse Ogg pages and extract individual Opus packets
|
|
37
|
-
* Ogg page structure:
|
|
38
|
-
* - 4 bytes: "OggS" magic
|
|
39
|
-
* - 1 byte: version
|
|
40
|
-
* - 1 byte: header type
|
|
41
|
-
* - 8 bytes: granule position
|
|
42
|
-
* - 4 bytes: serial number
|
|
43
|
-
* - 4 bytes: page sequence number
|
|
44
|
-
* - 4 bytes: checksum
|
|
45
|
-
* - 1 byte: number of segments
|
|
46
|
-
* - N bytes: segment table (one byte per segment)
|
|
47
|
-
* - data: concatenated segments
|
|
48
|
-
*/
|
|
49
|
-
private findOggPage;
|
|
50
|
-
/**
|
|
51
|
-
* Extract individual Opus packets from Ogg page segments
|
|
24
|
+
* Get the number of samples per frame based on codec
|
|
52
25
|
*/
|
|
53
|
-
private
|
|
26
|
+
private getFrameSamples;
|
|
54
27
|
/**
|
|
55
28
|
* Emit an encoded packet via Mediabunny callback
|
|
56
29
|
*/
|
|
57
30
|
private emitPacket;
|
|
58
|
-
/**
|
|
59
|
-
* Get the number of samples per frame based on codec
|
|
60
|
-
*/
|
|
61
|
-
private getFrameSamples;
|
|
62
31
|
/**
|
|
63
32
|
* Get codec string for the output format
|
|
64
33
|
*/
|
|
@@ -69,9 +38,7 @@ export declare class FFmpegAudioEncoder extends CustomAudioEncoder {
|
|
|
69
38
|
private buildOpusDescription;
|
|
70
39
|
/**
|
|
71
40
|
* Build AAC AudioSpecificConfig for decoder config description
|
|
72
|
-
* ISO 14496-3 section 1.6.2.1
|
|
73
41
|
*/
|
|
74
42
|
private buildAacDescription;
|
|
75
|
-
private stripAdtsHeader;
|
|
76
43
|
}
|
|
77
44
|
//# sourceMappingURL=FFmpegAudioEncoder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegAudioEncoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioEncoder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"FFmpegAudioEncoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioEncoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EAEX,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAIlE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BrB,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;YACW,aAAa;IAiC3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
|