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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeAvAudioEncoder - Audio encoder using node-av native bindings
|
|
3
|
+
*
|
|
4
|
+
* Implements the AudioEncoderBackend interface for encoding audio samples
|
|
5
|
+
* using FFmpeg's libav* libraries via node-av.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { Frame } from 'node-av/lib';
|
|
9
|
+
import type { AudioEncoderBackend, AudioEncoderBackendConfig } from '../backends/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* NodeAV-backed audio encoder implementing AudioEncoderBackend interface
|
|
12
|
+
*/
|
|
13
|
+
export declare class NodeAvAudioEncoder extends EventEmitter implements AudioEncoderBackend {
|
|
14
|
+
private encoder;
|
|
15
|
+
private config;
|
|
16
|
+
private frameIndex;
|
|
17
|
+
private queue;
|
|
18
|
+
private processing;
|
|
19
|
+
private processingPromise;
|
|
20
|
+
private shuttingDown;
|
|
21
|
+
private sampleFormat;
|
|
22
|
+
private encoderSampleFormat;
|
|
23
|
+
private timeBase;
|
|
24
|
+
private codecDescription;
|
|
25
|
+
private firstFrame;
|
|
26
|
+
get isHealthy(): boolean;
|
|
27
|
+
startEncoder(config: AudioEncoderBackendConfig): void;
|
|
28
|
+
write(data: Buffer | Uint8Array): boolean;
|
|
29
|
+
writeFrame(frame: Frame, owned?: boolean): boolean;
|
|
30
|
+
end(): void;
|
|
31
|
+
kill(): void;
|
|
32
|
+
shutdown(): Promise<void>;
|
|
33
|
+
private processQueue;
|
|
34
|
+
private ensureEncoder;
|
|
35
|
+
private encodeFrame;
|
|
36
|
+
private extractCodecDescription;
|
|
37
|
+
private getEncoderCodec;
|
|
38
|
+
private buildEncoderOptions;
|
|
39
|
+
private getChannelLayout;
|
|
40
|
+
private encodeBuffer;
|
|
41
|
+
private convertToPlanar;
|
|
42
|
+
private convertToS16Interleaved;
|
|
43
|
+
private convertToS32Interleaved;
|
|
44
|
+
private convertToS16Planar;
|
|
45
|
+
private convertToU8Interleaved;
|
|
46
|
+
private finish;
|
|
47
|
+
private drainPackets;
|
|
48
|
+
private cleanup;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=NodeAvAudioEncoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvAudioEncoder.d.ts","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioEncoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAY,MAAM,aAAa,CAAC;AAkB9C,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AAQ9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAkE;IAC/E,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAAQ;IAE1B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAOrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAUzC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,OAAc,GAAG,OAAO;IAsBxD,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA+BZ,aAAa;YAmBb,WAAW;IAwCzB,OAAO,CAAC,uBAAuB;IA2C/B,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,mBAAmB;IAiE3B,OAAO,CAAC,gBAAgB;YAiBV,YAAY;IAkE1B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,sBAAsB;YAehB,MAAM;YAmBN,YAAY;IAyB1B,OAAO,CAAC,OAAO;CAKhB"}
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeAvAudioEncoder - Audio encoder using node-av native bindings
|
|
3
|
+
*
|
|
4
|
+
* Implements the AudioEncoderBackend interface for encoding audio samples
|
|
5
|
+
* using FFmpeg's libav* libraries via node-av.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { Encoder } from 'node-av/api';
|
|
9
|
+
import { Frame, Rational } from 'node-av/lib';
|
|
10
|
+
import { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32, AV_PKT_FLAG_KEY, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
|
|
11
|
+
import { createLogger } from '../utils/logger.js';
|
|
12
|
+
const logger = createLogger('NodeAvAudioEncoder');
|
|
13
|
+
/** Default sample rate for Opus codec */
|
|
14
|
+
const OPUS_SAMPLE_RATE = 48000;
|
|
15
|
+
/**
|
|
16
|
+
* NodeAV-backed audio encoder implementing AudioEncoderBackend interface
|
|
17
|
+
*/
|
|
18
|
+
export class NodeAvAudioEncoder extends EventEmitter {
|
|
19
|
+
encoder = null;
|
|
20
|
+
config = null;
|
|
21
|
+
frameIndex = 0;
|
|
22
|
+
queue = [];
|
|
23
|
+
processing = false;
|
|
24
|
+
processingPromise = null;
|
|
25
|
+
shuttingDown = false;
|
|
26
|
+
sampleFormat = AV_SAMPLE_FMT_FLT;
|
|
27
|
+
encoderSampleFormat = AV_SAMPLE_FMT_FLTP;
|
|
28
|
+
timeBase = new Rational(1, OPUS_SAMPLE_RATE);
|
|
29
|
+
codecDescription = null;
|
|
30
|
+
firstFrame = true;
|
|
31
|
+
get isHealthy() {
|
|
32
|
+
return !this.shuttingDown;
|
|
33
|
+
}
|
|
34
|
+
startEncoder(config) {
|
|
35
|
+
this.config = { ...config };
|
|
36
|
+
this.timeBase = new Rational(1, config.sampleRate);
|
|
37
|
+
// Input is always float32 interleaved from AudioData conversion
|
|
38
|
+
this.sampleFormat = AV_SAMPLE_FMT_FLT;
|
|
39
|
+
}
|
|
40
|
+
write(data) {
|
|
41
|
+
if (!this.config || this.shuttingDown) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
this.queue.push({ buffer: Buffer.from(data), owned: true });
|
|
45
|
+
void this.processQueue();
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
writeFrame(frame, owned = true) {
|
|
49
|
+
if (!this.config || this.shuttingDown) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const buf = frame.toBuffer();
|
|
54
|
+
if (owned) {
|
|
55
|
+
try {
|
|
56
|
+
frame.unref();
|
|
57
|
+
}
|
|
58
|
+
catch { /* ignore */ }
|
|
59
|
+
}
|
|
60
|
+
this.queue.push({ buffer: Buffer.from(buf), owned: true });
|
|
61
|
+
void this.processQueue();
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (owned) {
|
|
66
|
+
try {
|
|
67
|
+
frame.unref();
|
|
68
|
+
}
|
|
69
|
+
catch { /* ignore */ }
|
|
70
|
+
}
|
|
71
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
end() {
|
|
76
|
+
if (this.shuttingDown)
|
|
77
|
+
return;
|
|
78
|
+
this.shuttingDown = true;
|
|
79
|
+
void this.finish().catch((err) => this.emit('error', err));
|
|
80
|
+
}
|
|
81
|
+
kill() {
|
|
82
|
+
this.shuttingDown = true;
|
|
83
|
+
this.cleanup();
|
|
84
|
+
this.emit('close', null);
|
|
85
|
+
}
|
|
86
|
+
async shutdown() {
|
|
87
|
+
this.end();
|
|
88
|
+
}
|
|
89
|
+
async processQueue() {
|
|
90
|
+
if (this.processingPromise) {
|
|
91
|
+
return this.processingPromise;
|
|
92
|
+
}
|
|
93
|
+
this.processingPromise = (async () => {
|
|
94
|
+
if (this.processing)
|
|
95
|
+
return;
|
|
96
|
+
this.processing = true;
|
|
97
|
+
try {
|
|
98
|
+
while (this.queue.length > 0) {
|
|
99
|
+
const item = this.queue.shift();
|
|
100
|
+
// Emit frameAccepted when frame starts processing (for dequeue event)
|
|
101
|
+
setImmediate(() => this.emit('frameAccepted'));
|
|
102
|
+
if (item.frame) {
|
|
103
|
+
await this.encodeFrame(item.frame, item.owned ?? true);
|
|
104
|
+
}
|
|
105
|
+
else if (item.buffer) {
|
|
106
|
+
await this.encodeBuffer(item.buffer);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
this.processing = false;
|
|
115
|
+
this.processingPromise = null;
|
|
116
|
+
}
|
|
117
|
+
})();
|
|
118
|
+
return this.processingPromise;
|
|
119
|
+
}
|
|
120
|
+
async ensureEncoder() {
|
|
121
|
+
if (this.encoder || !this.config) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const encoderCodec = this.getEncoderCodec(this.config.codec);
|
|
125
|
+
const options = this.buildEncoderOptions();
|
|
126
|
+
// Store the encoder's required sample format
|
|
127
|
+
this.encoderSampleFormat = options.sampleFormat;
|
|
128
|
+
logger.info(`Using encoder: ${encoderCodec}, format: ${options.sampleFormat}`);
|
|
129
|
+
this.encoder = await Encoder.create(encoderCodec, options);
|
|
130
|
+
// Extract codec description (extradata) for codecs that require it
|
|
131
|
+
this.extractCodecDescription();
|
|
132
|
+
}
|
|
133
|
+
async encodeFrame(inputFrame, owned) {
|
|
134
|
+
try {
|
|
135
|
+
await this.ensureEncoder();
|
|
136
|
+
if (!this.encoder || !this.config) {
|
|
137
|
+
throw new Error('Encoder not initialized');
|
|
138
|
+
}
|
|
139
|
+
const matchesFormat = inputFrame.format === this.encoderSampleFormat;
|
|
140
|
+
const matchesRate = Number(inputFrame.sampleRate ?? this.config.sampleRate) === this.config.sampleRate;
|
|
141
|
+
if (matchesFormat && matchesRate) {
|
|
142
|
+
inputFrame.pts = BigInt(this.frameIndex);
|
|
143
|
+
const nbSamples = inputFrame.nbSamples ?? 0;
|
|
144
|
+
try {
|
|
145
|
+
await this.encoder.encode(inputFrame);
|
|
146
|
+
if (owned) {
|
|
147
|
+
inputFrame.unref();
|
|
148
|
+
}
|
|
149
|
+
await this.drainPackets();
|
|
150
|
+
this.frameIndex += nbSamples;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
// Fallback to buffer path if direct encode fails
|
|
155
|
+
logger.debug(`Direct frame encode failed, falling back to buffer: ${err instanceof Error ? err.message : err}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const buffer = inputFrame.toBuffer();
|
|
159
|
+
if (owned) {
|
|
160
|
+
inputFrame.unref();
|
|
161
|
+
}
|
|
162
|
+
await this.encodeBuffer(buffer);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (owned) {
|
|
166
|
+
try {
|
|
167
|
+
inputFrame.unref();
|
|
168
|
+
}
|
|
169
|
+
catch { /* ignore */ }
|
|
170
|
+
}
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
extractCodecDescription() {
|
|
175
|
+
if (!this.encoder || !this.config)
|
|
176
|
+
return;
|
|
177
|
+
if (this.codecDescription)
|
|
178
|
+
return; // Already extracted
|
|
179
|
+
const codecBase = this.config.codec.split('.')[0].toLowerCase();
|
|
180
|
+
try {
|
|
181
|
+
const ctx = this.encoder.getCodecContext();
|
|
182
|
+
if (!ctx)
|
|
183
|
+
return;
|
|
184
|
+
const extraData = ctx.extraData;
|
|
185
|
+
if (!extraData || extraData.length === 0)
|
|
186
|
+
return;
|
|
187
|
+
if (codecBase === 'mp4a' || codecBase === 'aac') {
|
|
188
|
+
// AAC: extradata contains AudioSpecificConfig (including PCE if needed)
|
|
189
|
+
// This is the proper description for MP4 muxing and decoding
|
|
190
|
+
this.codecDescription = Buffer.from(extraData);
|
|
191
|
+
logger.debug(`AAC description from extradata: ${this.codecDescription.length} bytes`);
|
|
192
|
+
}
|
|
193
|
+
else if (codecBase === 'opus') {
|
|
194
|
+
// Opus: extradata contains OpusHead structure
|
|
195
|
+
// Required for multi-channel Opus decoding
|
|
196
|
+
this.codecDescription = Buffer.from(extraData);
|
|
197
|
+
logger.debug(`Opus description from extradata: ${this.codecDescription.length} bytes`);
|
|
198
|
+
}
|
|
199
|
+
else if (codecBase === 'flac') {
|
|
200
|
+
// FLAC description: 'fLaC' magic + STREAMINFO block
|
|
201
|
+
// The extradata from FFmpeg is just the STREAMINFO, we need to prepend magic
|
|
202
|
+
const magic = Buffer.from('fLaC');
|
|
203
|
+
// STREAMINFO block header: type (0x00 for STREAMINFO) | last-block flag (0x80 if last)
|
|
204
|
+
// followed by 3-byte length
|
|
205
|
+
const blockHeader = Buffer.from([0x80, 0x00, 0x00, extraData.length]);
|
|
206
|
+
this.codecDescription = Buffer.concat([magic, blockHeader, extraData]);
|
|
207
|
+
logger.debug(`FLAC description: ${this.codecDescription.length} bytes`);
|
|
208
|
+
}
|
|
209
|
+
else if (codecBase === 'vorbis') {
|
|
210
|
+
// Vorbis description is the identification + comment + setup headers
|
|
211
|
+
// The extradata from FFmpeg should contain all three headers
|
|
212
|
+
this.codecDescription = Buffer.from(extraData);
|
|
213
|
+
logger.debug(`Vorbis description: ${this.codecDescription.length} bytes`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
logger.debug(`Failed to extract codec description: ${err}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
getEncoderCodec(codec) {
|
|
221
|
+
const codecBase = codec.split('.')[0].toLowerCase();
|
|
222
|
+
switch (codecBase) {
|
|
223
|
+
case 'opus':
|
|
224
|
+
return 'libopus';
|
|
225
|
+
case 'mp3':
|
|
226
|
+
return 'libmp3lame';
|
|
227
|
+
case 'flac':
|
|
228
|
+
return 'flac';
|
|
229
|
+
case 'mp4a':
|
|
230
|
+
case 'aac':
|
|
231
|
+
return 'aac';
|
|
232
|
+
case 'vorbis':
|
|
233
|
+
return 'libvorbis';
|
|
234
|
+
case 'pcm-s16':
|
|
235
|
+
return 'pcm_s16le';
|
|
236
|
+
case 'pcm-s24':
|
|
237
|
+
return 'pcm_s24le';
|
|
238
|
+
case 'pcm-s32':
|
|
239
|
+
return 'pcm_s32le';
|
|
240
|
+
case 'pcm-u8':
|
|
241
|
+
return 'pcm_u8';
|
|
242
|
+
case 'ulaw':
|
|
243
|
+
return 'pcm_mulaw';
|
|
244
|
+
case 'alaw':
|
|
245
|
+
return 'pcm_alaw';
|
|
246
|
+
case 'pcm-f32':
|
|
247
|
+
return 'pcm_f32le';
|
|
248
|
+
default:
|
|
249
|
+
return 'aac';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
buildEncoderOptions() {
|
|
253
|
+
if (!this.config) {
|
|
254
|
+
throw new Error('Config not set');
|
|
255
|
+
}
|
|
256
|
+
const codecBase = this.config.codec.split('.')[0].toLowerCase();
|
|
257
|
+
const isOpus = codecBase === 'opus';
|
|
258
|
+
const isVorbis = codecBase === 'vorbis';
|
|
259
|
+
const isFlac = codecBase === 'flac';
|
|
260
|
+
const isRealtime = this.config.latencyMode === 'realtime';
|
|
261
|
+
// Determine output sample format based on codec requirements
|
|
262
|
+
// Each codec has specific format requirements:
|
|
263
|
+
// - libopus: s16 or flt (interleaved only)
|
|
264
|
+
// - libvorbis: fltp (planar float)
|
|
265
|
+
// - aac: fltp (planar float)
|
|
266
|
+
// - flac: s16, s32 (interleaved signed)
|
|
267
|
+
let sampleFormat;
|
|
268
|
+
if (isOpus) {
|
|
269
|
+
// libopus only supports s16 or flt (interleaved)
|
|
270
|
+
sampleFormat = AV_SAMPLE_FMT_FLT;
|
|
271
|
+
}
|
|
272
|
+
else if (isVorbis) {
|
|
273
|
+
sampleFormat = AV_SAMPLE_FMT_FLTP;
|
|
274
|
+
}
|
|
275
|
+
else if (isFlac || codecBase === 'pcm-s16') {
|
|
276
|
+
// flac encoder requires interleaved s16 or s32
|
|
277
|
+
sampleFormat = AV_SAMPLE_FMT_S16;
|
|
278
|
+
}
|
|
279
|
+
else if (codecBase === 'pcm-s24' || codecBase === 'pcm-s32') {
|
|
280
|
+
sampleFormat = AV_SAMPLE_FMT_S32;
|
|
281
|
+
}
|
|
282
|
+
else if (codecBase === 'pcm-u8') {
|
|
283
|
+
sampleFormat = AV_SAMPLE_FMT_U8;
|
|
284
|
+
}
|
|
285
|
+
else if (codecBase === 'ulaw' || codecBase === 'alaw') {
|
|
286
|
+
sampleFormat = AV_SAMPLE_FMT_S16;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
// Most codecs work with float planar (aac, etc.)
|
|
290
|
+
sampleFormat = AV_SAMPLE_FMT_FLTP;
|
|
291
|
+
}
|
|
292
|
+
const options = {};
|
|
293
|
+
// Codec-specific options
|
|
294
|
+
if (isOpus) {
|
|
295
|
+
options.application = isRealtime ? 'voip' : 'audio';
|
|
296
|
+
if (isRealtime) {
|
|
297
|
+
options.frame_duration = '10';
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Frame size configuration for specific codecs
|
|
301
|
+
if (isFlac) {
|
|
302
|
+
// FLAC default block size is 4608 samples, which is too large for small inputs
|
|
303
|
+
// Use a smaller frame size to allow encoding of smaller buffers
|
|
304
|
+
options.frame_size = '1024';
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
type: 'audio',
|
|
308
|
+
sampleRate: isOpus ? OPUS_SAMPLE_RATE : this.config.sampleRate,
|
|
309
|
+
channelLayout: this.getChannelLayout(this.config.numberOfChannels),
|
|
310
|
+
sampleFormat,
|
|
311
|
+
timeBase: this.timeBase,
|
|
312
|
+
bitrate: this.config.bitrate,
|
|
313
|
+
options,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
getChannelLayout(numChannels) {
|
|
317
|
+
// Standard channel layouts as ChannelLayout objects
|
|
318
|
+
// Order 1 = AV_CHANNEL_ORDER_NATIVE (required for FFmpeg)
|
|
319
|
+
switch (numChannels) {
|
|
320
|
+
case 1:
|
|
321
|
+
return { nbChannels: 1, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_MONO };
|
|
322
|
+
case 2:
|
|
323
|
+
return { nbChannels: 2, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_STEREO };
|
|
324
|
+
case 6:
|
|
325
|
+
return { nbChannels: 6, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_5POINT1 };
|
|
326
|
+
case 8:
|
|
327
|
+
return { nbChannels: 8, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_7POINT1 };
|
|
328
|
+
default:
|
|
329
|
+
return { nbChannels: numChannels, order: AV_CHANNEL_ORDER_NATIVE, mask: BigInt((1 << numChannels) - 1) };
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
async encodeBuffer(buffer) {
|
|
333
|
+
await this.ensureEncoder();
|
|
334
|
+
if (!this.encoder || !this.config) {
|
|
335
|
+
throw new Error('Encoder not initialized');
|
|
336
|
+
}
|
|
337
|
+
// Buffer is f32le interleaved, we need to convert to the encoder's expected format
|
|
338
|
+
// Calculate number of samples (each sample is 4 bytes for f32)
|
|
339
|
+
const bytesPerSample = 4;
|
|
340
|
+
const totalSamples = buffer.length / bytesPerSample;
|
|
341
|
+
const samplesPerChannel = Math.floor(totalSamples / this.config.numberOfChannels);
|
|
342
|
+
if (samplesPerChannel === 0) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
// Prepare audio data based on encoder's expected format
|
|
346
|
+
let audioData;
|
|
347
|
+
let frameFormat;
|
|
348
|
+
if (this.encoderSampleFormat === AV_SAMPLE_FMT_FLT) {
|
|
349
|
+
// Encoder needs interleaved float - use input buffer directly
|
|
350
|
+
audioData = buffer;
|
|
351
|
+
frameFormat = AV_SAMPLE_FMT_FLT;
|
|
352
|
+
}
|
|
353
|
+
else if (this.encoderSampleFormat === AV_SAMPLE_FMT_S16) {
|
|
354
|
+
// Encoder needs interleaved s16 - convert from f32 interleaved to s16 interleaved
|
|
355
|
+
audioData = Buffer.from(this.convertToS16Interleaved(buffer, samplesPerChannel, this.config.numberOfChannels));
|
|
356
|
+
frameFormat = AV_SAMPLE_FMT_S16;
|
|
357
|
+
}
|
|
358
|
+
else if (this.encoderSampleFormat === AV_SAMPLE_FMT_S16P) {
|
|
359
|
+
// Encoder needs planar s16 - convert from f32 interleaved to s16 planar
|
|
360
|
+
audioData = Buffer.from(this.convertToS16Planar(buffer, samplesPerChannel, this.config.numberOfChannels));
|
|
361
|
+
frameFormat = AV_SAMPLE_FMT_S16P;
|
|
362
|
+
}
|
|
363
|
+
else if (this.encoderSampleFormat === AV_SAMPLE_FMT_S32) {
|
|
364
|
+
// Encoder needs interleaved s32 - convert from f32 interleaved to s32 interleaved
|
|
365
|
+
audioData = Buffer.from(this.convertToS32Interleaved(buffer, samplesPerChannel, this.config.numberOfChannels));
|
|
366
|
+
frameFormat = AV_SAMPLE_FMT_S32;
|
|
367
|
+
}
|
|
368
|
+
else if (this.encoderSampleFormat === AV_SAMPLE_FMT_U8) {
|
|
369
|
+
audioData = Buffer.from(this.convertToU8Interleaved(buffer, samplesPerChannel, this.config.numberOfChannels));
|
|
370
|
+
frameFormat = AV_SAMPLE_FMT_U8;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
// Default: encoder needs planar float - convert from f32 interleaved to f32 planar
|
|
374
|
+
audioData = Buffer.from(this.convertToPlanar(buffer, samplesPerChannel, this.config.numberOfChannels));
|
|
375
|
+
frameFormat = AV_SAMPLE_FMT_FLTP;
|
|
376
|
+
}
|
|
377
|
+
const frame = Frame.fromAudioBuffer(audioData, {
|
|
378
|
+
sampleRate: this.config.sampleRate,
|
|
379
|
+
channelLayout: this.getChannelLayout(this.config.numberOfChannels),
|
|
380
|
+
format: frameFormat,
|
|
381
|
+
nbSamples: samplesPerChannel,
|
|
382
|
+
timeBase: this.timeBase,
|
|
383
|
+
});
|
|
384
|
+
frame.pts = BigInt(this.frameIndex);
|
|
385
|
+
await this.encoder.encode(frame);
|
|
386
|
+
frame.unref();
|
|
387
|
+
// Try to extract codec description after first encode (some codecs like FLAC
|
|
388
|
+
// don't populate extradata until after encoding starts)
|
|
389
|
+
this.extractCodecDescription();
|
|
390
|
+
await this.drainPackets();
|
|
391
|
+
this.frameIndex += samplesPerChannel;
|
|
392
|
+
}
|
|
393
|
+
convertToPlanar(data, samplesPerChannel, numChannels) {
|
|
394
|
+
const bytesPerSample = 4; // f32
|
|
395
|
+
const planeSize = samplesPerChannel * bytesPerSample;
|
|
396
|
+
const result = new Uint8Array(planeSize * numChannels);
|
|
397
|
+
const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
|
|
398
|
+
const output = new Float32Array(result.buffer);
|
|
399
|
+
for (let s = 0; s < samplesPerChannel; s++) {
|
|
400
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
401
|
+
const srcIdx = s * numChannels + ch;
|
|
402
|
+
const dstIdx = ch * samplesPerChannel + s;
|
|
403
|
+
output[dstIdx] = input[srcIdx];
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return result;
|
|
407
|
+
}
|
|
408
|
+
convertToS16Interleaved(data, samplesPerChannel, numChannels) {
|
|
409
|
+
const totalSamples = samplesPerChannel * numChannels;
|
|
410
|
+
const result = new Uint8Array(totalSamples * 2); // 2 bytes per s16 sample
|
|
411
|
+
const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
|
|
412
|
+
const output = new Int16Array(result.buffer);
|
|
413
|
+
for (let i = 0; i < totalSamples; i++) {
|
|
414
|
+
// Convert f32 [-1.0, 1.0] to s16 [-32768, 32767]
|
|
415
|
+
const clamped = Math.max(-1.0, Math.min(1.0, input[i]));
|
|
416
|
+
output[i] = Math.round(clamped * 32767);
|
|
417
|
+
}
|
|
418
|
+
return result;
|
|
419
|
+
}
|
|
420
|
+
convertToS32Interleaved(data, samplesPerChannel, numChannels) {
|
|
421
|
+
const totalSamples = samplesPerChannel * numChannels;
|
|
422
|
+
const result = new Uint8Array(totalSamples * 4); // 4 bytes per s32 sample
|
|
423
|
+
const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
|
|
424
|
+
const output = new Int32Array(result.buffer);
|
|
425
|
+
for (let i = 0; i < totalSamples; i++) {
|
|
426
|
+
const clamped = Math.max(-1.0, Math.min(1.0, input[i]));
|
|
427
|
+
output[i] = Math.round(clamped * 2147483647);
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
convertToS16Planar(data, samplesPerChannel, numChannels) {
|
|
432
|
+
const bytesPerSample = 2; // s16
|
|
433
|
+
const planeSize = samplesPerChannel * bytesPerSample;
|
|
434
|
+
const result = new Uint8Array(planeSize * numChannels);
|
|
435
|
+
const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
|
|
436
|
+
const output = new Int16Array(result.buffer);
|
|
437
|
+
for (let s = 0; s < samplesPerChannel; s++) {
|
|
438
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
439
|
+
const srcIdx = s * numChannels + ch;
|
|
440
|
+
const dstIdx = ch * samplesPerChannel + s;
|
|
441
|
+
// Convert f32 [-1.0, 1.0] to s16 [-32768, 32767]
|
|
442
|
+
const clamped = Math.max(-1.0, Math.min(1.0, input[srcIdx]));
|
|
443
|
+
output[dstIdx] = Math.round(clamped * 32767);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return result;
|
|
447
|
+
}
|
|
448
|
+
convertToU8Interleaved(data, samplesPerChannel, numChannels) {
|
|
449
|
+
const totalSamples = samplesPerChannel * numChannels;
|
|
450
|
+
const result = new Uint8Array(totalSamples);
|
|
451
|
+
const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
|
|
452
|
+
for (let i = 0; i < totalSamples; i++) {
|
|
453
|
+
const clamped = Math.max(-1.0, Math.min(1.0, input[i]));
|
|
454
|
+
const u8 = Math.round((clamped + 1) * 127.5); // map [-1,1] to [0,255]
|
|
455
|
+
result[i] = u8;
|
|
456
|
+
}
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
async finish() {
|
|
460
|
+
await this.processQueue();
|
|
461
|
+
if (this.processingPromise) {
|
|
462
|
+
await this.processingPromise;
|
|
463
|
+
}
|
|
464
|
+
if (this.encoder) {
|
|
465
|
+
try {
|
|
466
|
+
await this.encoder.flush();
|
|
467
|
+
await this.drainPackets();
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
this.emit('close', 0);
|
|
474
|
+
this.cleanup();
|
|
475
|
+
}
|
|
476
|
+
async drainPackets() {
|
|
477
|
+
if (!this.encoder)
|
|
478
|
+
return;
|
|
479
|
+
let packet = await this.encoder.receive();
|
|
480
|
+
while (packet) {
|
|
481
|
+
if (packet.data) {
|
|
482
|
+
const timestamp = packet.pts !== undefined ? Number(packet.pts) : this.frameIndex;
|
|
483
|
+
const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
|
|
484
|
+
const frameData = {
|
|
485
|
+
data: Buffer.from(packet.data),
|
|
486
|
+
timestamp,
|
|
487
|
+
keyFrame,
|
|
488
|
+
};
|
|
489
|
+
// Include codec description on the first frame
|
|
490
|
+
if (this.firstFrame && this.codecDescription) {
|
|
491
|
+
frameData.description = this.codecDescription;
|
|
492
|
+
this.firstFrame = false;
|
|
493
|
+
}
|
|
494
|
+
this.emit('encodedFrame', frameData);
|
|
495
|
+
}
|
|
496
|
+
packet.unref();
|
|
497
|
+
packet = await this.encoder.receive();
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
cleanup() {
|
|
501
|
+
this.encoder?.close();
|
|
502
|
+
this.encoder = null;
|
|
503
|
+
this.queue = [];
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=NodeAvAudioEncoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvAudioEncoder.js","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioEncoder.ts"],"names":[],"mappings":"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"}
|