webcodecs-node 0.5.0 → 0.5.2
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 +64 -184
- package/docs/api.md +1 -1
- package/docs/configuration.md +6 -17
- package/package.json +2 -2
- package/dist/AudioData.d.ts +0 -6
- package/dist/AudioData.d.ts.map +0 -1
- package/dist/AudioData.js +0 -6
- package/dist/AudioData.js.map +0 -1
- package/dist/AudioDecoder.d.ts +0 -6
- package/dist/AudioDecoder.d.ts.map +0 -1
- package/dist/AudioDecoder.js +0 -6
- package/dist/AudioDecoder.js.map +0 -1
- package/dist/AudioEncoder.d.ts +0 -6
- package/dist/AudioEncoder.d.ts.map +0 -1
- package/dist/AudioEncoder.js +0 -6
- package/dist/AudioEncoder.js.map +0 -1
- package/dist/EncodedAudioChunk.d.ts +0 -6
- package/dist/EncodedAudioChunk.d.ts.map +0 -1
- package/dist/EncodedAudioChunk.js +0 -6
- package/dist/EncodedAudioChunk.js.map +0 -1
- package/dist/EncodedVideoChunk.d.ts +0 -6
- package/dist/EncodedVideoChunk.d.ts.map +0 -1
- package/dist/EncodedVideoChunk.js +0 -6
- package/dist/EncodedVideoChunk.js.map +0 -1
- package/dist/FFmpegProcess.d.ts +0 -6
- package/dist/FFmpegProcess.d.ts.map +0 -1
- package/dist/FFmpegProcess.js +0 -6
- package/dist/FFmpegProcess.js.map +0 -1
- package/dist/HardwareAcceleration.d.ts +0 -6
- package/dist/HardwareAcceleration.d.ts.map +0 -1
- package/dist/HardwareAcceleration.js +0 -6
- package/dist/HardwareAcceleration.js.map +0 -1
- package/dist/ImageDecoder.d.ts +0 -6
- package/dist/ImageDecoder.d.ts.map +0 -1
- package/dist/ImageDecoder.js +0 -6
- package/dist/ImageDecoder.js.map +0 -1
- package/dist/Logger.d.ts +0 -6
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -6
- package/dist/Logger.js.map +0 -1
- package/dist/MediaCapabilities.d.ts +0 -9
- package/dist/MediaCapabilities.d.ts.map +0 -1
- package/dist/MediaCapabilities.js +0 -8
- package/dist/MediaCapabilities.js.map +0 -1
- package/dist/VideoDecoder.d.ts +0 -6
- package/dist/VideoDecoder.d.ts.map +0 -1
- package/dist/VideoDecoder.js +0 -6
- package/dist/VideoDecoder.js.map +0 -1
- package/dist/VideoEncoder.d.ts +0 -6
- package/dist/VideoEncoder.d.ts.map +0 -1
- package/dist/VideoEncoder.js +0 -6
- package/dist/VideoEncoder.js.map +0 -1
- package/dist/VideoFrame.d.ts +0 -10
- package/dist/VideoFrame.d.ts.map +0 -1
- package/dist/VideoFrame.js +0 -9
- package/dist/VideoFrame.js.map +0 -1
- package/dist/__tests__/AudioData.test.d.ts +0 -5
- package/dist/__tests__/AudioData.test.d.ts.map +0 -1
- package/dist/__tests__/AudioData.test.js +0 -180
- package/dist/__tests__/AudioData.test.js.map +0 -1
- package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
- package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioDecoder.test.js +0 -733
- package/dist/__tests__/AudioDecoder.test.js.map +0 -1
- package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
- package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioEncoder.test.js +0 -247
- package/dist/__tests__/AudioEncoder.test.js.map +0 -1
- package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
- package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
- package/dist/__tests__/EncodedChunks.test.js +0 -100
- package/dist/__tests__/EncodedChunks.test.js.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
- package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.js +0 -85
- package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
- package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.test.js +0 -558
- package/dist/__tests__/ImageDecoder.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
- package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.js +0 -346
- package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.js +0 -206
- package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.js +0 -176
- package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
- package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoDecoder.test.js +0 -675
- package/dist/__tests__/VideoDecoder.test.js.map +0 -1
- package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
- package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoEncoder.test.js +0 -468
- package/dist/__tests__/VideoEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoFrame.test.d.ts +0 -5
- package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
- package/dist/__tests__/VideoFrame.test.js +0 -246
- package/dist/__tests__/VideoFrame.test.js.map +0 -1
- package/dist/__tests__/aac-utils.test.d.ts +0 -2
- package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
- package/dist/__tests__/aac-utils.test.js +0 -37
- package/dist/__tests__/aac-utils.test.js.map +0 -1
- package/dist/__tests__/avc-utils.test.d.ts +0 -2
- package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/avc-utils.test.js +0 -63
- package/dist/__tests__/avc-utils.test.js.map +0 -1
- package/dist/__tests__/hevc-utils.test.d.ts +0 -2
- package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/hevc-utils.test.js +0 -78
- package/dist/__tests__/hevc-utils.test.js.map +0 -1
- package/dist/demos/demo-conversion.d.ts +0 -13
- package/dist/demos/demo-conversion.d.ts.map +0 -1
- package/dist/demos/demo-conversion.js +0 -301
- package/dist/demos/demo-conversion.js.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
- package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.js +0 -161
- package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
- package/dist/demos/demo-mediabunny.d.ts +0 -7
- package/dist/demos/demo-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-mediabunny.js +0 -78
- package/dist/demos/demo-mediabunny.js.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
- package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.js +0 -543
- package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
- package/dist/ffmpeg/audio-codecs.d.ts +0 -59
- package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
- package/dist/ffmpeg/audio-codecs.js +0 -99
- package/dist/ffmpeg/audio-codecs.js.map +0 -1
- package/dist/ffmpeg/formats.d.ts +0 -42
- package/dist/ffmpeg/formats.d.ts.map +0 -1
- package/dist/ffmpeg/formats.js +0 -147
- package/dist/ffmpeg/formats.js.map +0 -1
- package/dist/ffmpeg/index.d.ts +0 -10
- package/dist/ffmpeg/index.d.ts.map +0 -1
- package/dist/ffmpeg/index.js +0 -13
- package/dist/ffmpeg/index.js.map +0 -1
- package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
- package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/annexb.js +0 -201
- package/dist/ffmpeg/parsers/annexb.js.map +0 -1
- package/dist/ffmpeg/parsers/index.d.ts +0 -6
- package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/index.js +0 -8
- package/dist/ffmpeg/parsers/index.js.map +0 -1
- package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
- package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/ivf.js +0 -109
- package/dist/ffmpeg/parsers/ivf.js.map +0 -1
- package/dist/ffmpeg/types.d.ts +0 -85
- package/dist/ffmpeg/types.d.ts.map +0 -1
- package/dist/ffmpeg/types.js +0 -8
- package/dist/ffmpeg/types.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -24
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +0 -126
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -44
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +0 -221
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -25
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +0 -122
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -49
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +0 -264
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
- package/dist/mediabunny/index.d.ts +0 -21
- package/dist/mediabunny/index.d.ts.map +0 -1
- package/dist/mediabunny/index.js +0 -33
- package/dist/mediabunny/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* H.264/HEVC Annex B bitstream parser
|
|
3
|
-
*
|
|
4
|
-
* Parses Annex B format using Access Unit Delimiter (AUD) as frame boundaries.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* NAL unit types for H.264
|
|
8
|
-
*/
|
|
9
|
-
export const H264_NAL_TYPES = {
|
|
10
|
-
SLICE: 1, // Non-IDR slice
|
|
11
|
-
IDR: 5, // IDR slice (keyframe)
|
|
12
|
-
SEI: 6, // Supplemental Enhancement Information
|
|
13
|
-
SPS: 7, // Sequence Parameter Set
|
|
14
|
-
PPS: 8, // Picture Parameter Set
|
|
15
|
-
AUD: 9, // Access Unit Delimiter
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* NAL unit types for HEVC
|
|
19
|
-
*/
|
|
20
|
-
export const HEVC_NAL_TYPES = {
|
|
21
|
-
TRAIL_N: 0, // Non-reference trailing picture
|
|
22
|
-
TRAIL_R: 1, // Reference trailing picture
|
|
23
|
-
IDR_W_RADL: 19, // IDR with RADL
|
|
24
|
-
IDR_N_LP: 20, // IDR without leading pictures
|
|
25
|
-
CRA: 21, // Clean Random Access
|
|
26
|
-
VPS: 32, // Video Parameter Set
|
|
27
|
-
SPS: 33, // Sequence Parameter Set
|
|
28
|
-
PPS: 34, // Picture Parameter Set
|
|
29
|
-
AUD: 35, // Access Unit Delimiter
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Create initial Annex B parser state
|
|
33
|
-
*/
|
|
34
|
-
export function createAnnexBParserState(codec) {
|
|
35
|
-
return {
|
|
36
|
-
buffer: Buffer.alloc(0),
|
|
37
|
-
codec,
|
|
38
|
-
frameIndex: 0,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Get NAL unit type from first byte after start code
|
|
43
|
-
*/
|
|
44
|
-
export function getNalType(firstByte, codec) {
|
|
45
|
-
if (codec === 'h264') {
|
|
46
|
-
// H.264: NAL type is in bits 0-4
|
|
47
|
-
return firstByte & 0x1f;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
// HEVC: NAL type is in bits 1-6
|
|
51
|
-
return (firstByte >> 1) & 0x3f;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Check if NAL type is an Access Unit Delimiter
|
|
56
|
-
*/
|
|
57
|
-
export function isAudNal(nalType, codec) {
|
|
58
|
-
if (codec === 'h264') {
|
|
59
|
-
return nalType === H264_NAL_TYPES.AUD;
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
return nalType === HEVC_NAL_TYPES.AUD;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Find start code in buffer starting from offset
|
|
67
|
-
* Returns { position, length } or null if not found
|
|
68
|
-
*/
|
|
69
|
-
export function findStartCode(data, offset) {
|
|
70
|
-
for (let i = offset; i < data.length - 2; i++) {
|
|
71
|
-
if (data[i] === 0 && data[i + 1] === 0) {
|
|
72
|
-
if (data[i + 2] === 1) {
|
|
73
|
-
return { position: i, length: 3 };
|
|
74
|
-
}
|
|
75
|
-
else if (data[i + 2] === 0 && i + 3 < data.length && data[i + 3] === 1) {
|
|
76
|
-
return { position: i, length: 4 };
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Find all AUD positions in buffer
|
|
84
|
-
*/
|
|
85
|
-
export function findAudPositions(data, codec) {
|
|
86
|
-
const positions = [];
|
|
87
|
-
let offset = 0;
|
|
88
|
-
while (offset < data.length - 4) {
|
|
89
|
-
const startCode = findStartCode(data, offset);
|
|
90
|
-
if (!startCode)
|
|
91
|
-
break;
|
|
92
|
-
const nalStart = startCode.position + startCode.length;
|
|
93
|
-
if (nalStart < data.length) {
|
|
94
|
-
const nalType = getNalType(data[nalStart], codec);
|
|
95
|
-
if (isAudNal(nalType, codec)) {
|
|
96
|
-
positions.push(startCode.position);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
offset = nalStart;
|
|
100
|
-
}
|
|
101
|
-
return positions;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Check if H.264 frame is a keyframe
|
|
105
|
-
*/
|
|
106
|
-
export function isH264KeyFrame(data) {
|
|
107
|
-
let offset = 0;
|
|
108
|
-
while (offset < data.length - 4) {
|
|
109
|
-
const startCode = findStartCode(data, offset);
|
|
110
|
-
if (!startCode)
|
|
111
|
-
break;
|
|
112
|
-
const nalStart = startCode.position + startCode.length;
|
|
113
|
-
if (nalStart < data.length) {
|
|
114
|
-
const nalType = getNalType(data[nalStart], 'h264');
|
|
115
|
-
// IDR slice = keyframe
|
|
116
|
-
if (nalType === H264_NAL_TYPES.IDR)
|
|
117
|
-
return true;
|
|
118
|
-
// Non-IDR slice = not keyframe
|
|
119
|
-
if (nalType === H264_NAL_TYPES.SLICE)
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
offset = nalStart;
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Check if HEVC frame is a keyframe
|
|
128
|
-
*/
|
|
129
|
-
export function isHEVCKeyFrame(data) {
|
|
130
|
-
let offset = 0;
|
|
131
|
-
while (offset < data.length - 4) {
|
|
132
|
-
const startCode = findStartCode(data, offset);
|
|
133
|
-
if (!startCode)
|
|
134
|
-
break;
|
|
135
|
-
const nalStart = startCode.position + startCode.length;
|
|
136
|
-
if (nalStart < data.length) {
|
|
137
|
-
const nalType = getNalType(data[nalStart], 'hevc');
|
|
138
|
-
// IDR or CRA types are keyframes (16-21)
|
|
139
|
-
if (nalType >= 16 && nalType <= 21)
|
|
140
|
-
return true;
|
|
141
|
-
// Trailing picture types are not keyframes (0-9)
|
|
142
|
-
if (nalType >= 0 && nalType <= 9)
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
offset = nalStart;
|
|
146
|
-
}
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Check if frame is a keyframe based on codec
|
|
151
|
-
*/
|
|
152
|
-
export function isKeyFrame(data, codec) {
|
|
153
|
-
return codec === 'h264' ? isH264KeyFrame(data) : isHEVCKeyFrame(data);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Parse Annex B frames from accumulated data
|
|
157
|
-
*
|
|
158
|
-
* @param state - Parser state (mutated)
|
|
159
|
-
* @param newData - New data to append
|
|
160
|
-
* @returns Array of parsed frames
|
|
161
|
-
*/
|
|
162
|
-
export function parseAnnexBFrames(state, newData) {
|
|
163
|
-
const frames = [];
|
|
164
|
-
// Append new data
|
|
165
|
-
state.buffer = Buffer.concat([state.buffer, newData]);
|
|
166
|
-
// Find all AUD positions
|
|
167
|
-
const audPositions = findAudPositions(state.buffer, state.codec);
|
|
168
|
-
// Need at least 2 AUDs to have a complete frame
|
|
169
|
-
if (audPositions.length < 2) {
|
|
170
|
-
return frames;
|
|
171
|
-
}
|
|
172
|
-
// Emit all complete frames
|
|
173
|
-
for (let i = 0; i < audPositions.length - 1; i++) {
|
|
174
|
-
const frameData = Buffer.from(state.buffer.subarray(audPositions[i], audPositions[i + 1]));
|
|
175
|
-
frames.push({
|
|
176
|
-
data: frameData,
|
|
177
|
-
timestamp: state.frameIndex++,
|
|
178
|
-
keyFrame: isKeyFrame(frameData, state.codec),
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// Keep the last incomplete frame
|
|
182
|
-
const lastAudPos = audPositions[audPositions.length - 1];
|
|
183
|
-
state.buffer = Buffer.from(state.buffer.subarray(lastAudPos));
|
|
184
|
-
return frames;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Flush remaining data as final frame
|
|
188
|
-
*/
|
|
189
|
-
export function flushAnnexBParser(state) {
|
|
190
|
-
if (state.buffer.length === 0) {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
const frameData = Buffer.from(state.buffer);
|
|
194
|
-
state.buffer = Buffer.alloc(0);
|
|
195
|
-
return {
|
|
196
|
-
data: frameData,
|
|
197
|
-
timestamp: state.frameIndex++,
|
|
198
|
-
keyFrame: isKeyFrame(frameData, state.codec),
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
//# sourceMappingURL=annexb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"annexb.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/annexb.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Frame parsers for different container formats
|
|
3
|
-
*/
|
|
4
|
-
export { IVF_HEADER_SIZE, IVF_FRAME_HEADER_SIZE, IVF_SIGNATURE, createIvfParserState, validateIvfSignature, parseIvfFrames, isVP9KeyFrame, isVP8KeyFrame, isAV1KeyFrame, type IvfParserState, } from './ivf.js';
|
|
5
|
-
export { H264_NAL_TYPES, HEVC_NAL_TYPES, createAnnexBParserState, getNalType, isAudNal, findStartCode, findAudPositions, isH264KeyFrame, isHEVCKeyFrame, isKeyFrame, parseAnnexBFrames, flushAnnexBParser, type AnnexBParserState, } from './annexb.js';
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Frame parsers for different container formats
|
|
3
|
-
*/
|
|
4
|
-
// IVF parser (VP8, VP9, AV1)
|
|
5
|
-
export { IVF_HEADER_SIZE, IVF_FRAME_HEADER_SIZE, IVF_SIGNATURE, createIvfParserState, validateIvfSignature, parseIvfFrames, isVP9KeyFrame, isVP8KeyFrame, isAV1KeyFrame, } from './ivf.js';
|
|
6
|
-
// Annex B parser (H.264, HEVC)
|
|
7
|
-
export { H264_NAL_TYPES, HEVC_NAL_TYPES, createAnnexBParserState, getNalType, isAudNal, findStartCode, findAudPositions, isH264KeyFrame, isHEVCKeyFrame, isKeyFrame, parseAnnexBFrames, flushAnnexBParser, } from './annexb.js';
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6BAA6B;AAC7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,GAEd,MAAM,UAAU,CAAC;AAElB,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,aAAa,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IVF container parser
|
|
3
|
-
*
|
|
4
|
-
* IVF format (used for VP8, VP9, AV1):
|
|
5
|
-
* - 32-byte file header
|
|
6
|
-
* - Per frame: 4-byte size (LE) + 8-byte timestamp (LE) + frame data
|
|
7
|
-
*/
|
|
8
|
-
import type { EncodedFrameData } from '../types.js';
|
|
9
|
-
/** IVF file header size */
|
|
10
|
-
export declare const IVF_HEADER_SIZE = 32;
|
|
11
|
-
/** IVF frame header size (size + timestamp) */
|
|
12
|
-
export declare const IVF_FRAME_HEADER_SIZE = 12;
|
|
13
|
-
/** IVF file signature */
|
|
14
|
-
export declare const IVF_SIGNATURE = "DKIF";
|
|
15
|
-
/**
|
|
16
|
-
* IVF parser state
|
|
17
|
-
*/
|
|
18
|
-
export interface IvfParserState {
|
|
19
|
-
headerParsed: boolean;
|
|
20
|
-
buffer: Buffer;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Create initial IVF parser state
|
|
24
|
-
*/
|
|
25
|
-
export declare function createIvfParserState(): IvfParserState;
|
|
26
|
-
/**
|
|
27
|
-
* Validate IVF file signature
|
|
28
|
-
*/
|
|
29
|
-
export declare function validateIvfSignature(data: Buffer): boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Parse IVF frames from accumulated data
|
|
32
|
-
*
|
|
33
|
-
* @param state - Parser state (mutated)
|
|
34
|
-
* @param newData - New data to append
|
|
35
|
-
* @param isKeyFrame - Function to determine if frame is a keyframe
|
|
36
|
-
* @returns Array of parsed frames
|
|
37
|
-
*/
|
|
38
|
-
export declare function parseIvfFrames(state: IvfParserState, newData: Buffer, isKeyFrame: (data: Buffer) => boolean): EncodedFrameData[];
|
|
39
|
-
/**
|
|
40
|
-
* Check if VP9 frame is a keyframe
|
|
41
|
-
* VP9: frame_type bit in frame header (0 = keyframe)
|
|
42
|
-
*/
|
|
43
|
-
export declare function isVP9KeyFrame(data: Buffer): boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Check if VP8 frame is a keyframe
|
|
46
|
-
* VP8: keyframe indicated by bit in frame tag
|
|
47
|
-
*/
|
|
48
|
-
export declare function isVP8KeyFrame(data: Buffer): boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Check if AV1 frame is a keyframe
|
|
51
|
-
* Simplified check - real implementation would parse OBU headers
|
|
52
|
-
*/
|
|
53
|
-
export declare function isAV1KeyFrame(data: Buffer): boolean;
|
|
54
|
-
//# sourceMappingURL=ivf.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ivf.d.ts","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/ivf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,2BAA2B;AAC3B,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,yBAAyB;AACzB,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAKrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACpC,gBAAgB,EAAE,CA2CpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IVF container parser
|
|
3
|
-
*
|
|
4
|
-
* IVF format (used for VP8, VP9, AV1):
|
|
5
|
-
* - 32-byte file header
|
|
6
|
-
* - Per frame: 4-byte size (LE) + 8-byte timestamp (LE) + frame data
|
|
7
|
-
*/
|
|
8
|
-
/** IVF file header size */
|
|
9
|
-
export const IVF_HEADER_SIZE = 32;
|
|
10
|
-
/** IVF frame header size (size + timestamp) */
|
|
11
|
-
export const IVF_FRAME_HEADER_SIZE = 12;
|
|
12
|
-
/** IVF file signature */
|
|
13
|
-
export const IVF_SIGNATURE = 'DKIF';
|
|
14
|
-
/**
|
|
15
|
-
* Create initial IVF parser state
|
|
16
|
-
*/
|
|
17
|
-
export function createIvfParserState() {
|
|
18
|
-
return {
|
|
19
|
-
headerParsed: false,
|
|
20
|
-
buffer: Buffer.alloc(0),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Validate IVF file signature
|
|
25
|
-
*/
|
|
26
|
-
export function validateIvfSignature(data) {
|
|
27
|
-
if (data.length < 4)
|
|
28
|
-
return false;
|
|
29
|
-
return data.subarray(0, 4).toString() === IVF_SIGNATURE;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Parse IVF frames from accumulated data
|
|
33
|
-
*
|
|
34
|
-
* @param state - Parser state (mutated)
|
|
35
|
-
* @param newData - New data to append
|
|
36
|
-
* @param isKeyFrame - Function to determine if frame is a keyframe
|
|
37
|
-
* @returns Array of parsed frames
|
|
38
|
-
*/
|
|
39
|
-
export function parseIvfFrames(state, newData, isKeyFrame) {
|
|
40
|
-
const frames = [];
|
|
41
|
-
// Append new data
|
|
42
|
-
state.buffer = Buffer.concat([state.buffer, newData]);
|
|
43
|
-
// Skip 32-byte IVF file header
|
|
44
|
-
if (!state.headerParsed) {
|
|
45
|
-
if (state.buffer.length < IVF_HEADER_SIZE) {
|
|
46
|
-
return frames; // Wait for more data
|
|
47
|
-
}
|
|
48
|
-
// Verify IVF signature "DKIF"
|
|
49
|
-
if (!validateIvfSignature(state.buffer)) {
|
|
50
|
-
const signature = state.buffer.subarray(0, 4).toString();
|
|
51
|
-
throw new Error(`Invalid IVF signature: ${signature}`);
|
|
52
|
-
}
|
|
53
|
-
state.buffer = state.buffer.subarray(IVF_HEADER_SIZE);
|
|
54
|
-
state.headerParsed = true;
|
|
55
|
-
}
|
|
56
|
-
// Parse frames: 4-byte size + 8-byte timestamp + data
|
|
57
|
-
while (state.buffer.length >= IVF_FRAME_HEADER_SIZE) {
|
|
58
|
-
const frameSize = state.buffer.readUInt32LE(0);
|
|
59
|
-
const timestamp = Number(state.buffer.readBigUInt64LE(4));
|
|
60
|
-
const totalFrameSize = IVF_FRAME_HEADER_SIZE + frameSize;
|
|
61
|
-
if (state.buffer.length < totalFrameSize) {
|
|
62
|
-
break; // Wait for more data
|
|
63
|
-
}
|
|
64
|
-
const frameData = state.buffer.subarray(IVF_FRAME_HEADER_SIZE, totalFrameSize);
|
|
65
|
-
state.buffer = state.buffer.subarray(totalFrameSize);
|
|
66
|
-
frames.push({
|
|
67
|
-
data: Buffer.from(frameData), // Copy the data
|
|
68
|
-
timestamp,
|
|
69
|
-
keyFrame: isKeyFrame(frameData),
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return frames;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Check if VP9 frame is a keyframe
|
|
76
|
-
* VP9: frame_type bit in frame header (0 = keyframe)
|
|
77
|
-
*/
|
|
78
|
-
export function isVP9KeyFrame(data) {
|
|
79
|
-
if (data.length === 0)
|
|
80
|
-
return false;
|
|
81
|
-
// VP9: check frame_type bit (bit 1 of first byte)
|
|
82
|
-
// frame_type = 0 means keyframe
|
|
83
|
-
return (data[0] & 0x02) === 0;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Check if VP8 frame is a keyframe
|
|
87
|
-
* VP8: keyframe indicated by bit in frame tag
|
|
88
|
-
*/
|
|
89
|
-
export function isVP8KeyFrame(data) {
|
|
90
|
-
if (data.length === 0)
|
|
91
|
-
return false;
|
|
92
|
-
// VP8: keyframe has specific frame tag
|
|
93
|
-
// First bit of first byte indicates frame type (0 = key)
|
|
94
|
-
return (data[0] & 0x01) === 0;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Check if AV1 frame is a keyframe
|
|
98
|
-
* Simplified check - real implementation would parse OBU headers
|
|
99
|
-
*/
|
|
100
|
-
export function isAV1KeyFrame(data) {
|
|
101
|
-
if (data.length < 2)
|
|
102
|
-
return false;
|
|
103
|
-
// AV1 OBU header parsing - simplified
|
|
104
|
-
// This is a basic heuristic; full parsing would check OBU types
|
|
105
|
-
const obuType = (data[0] >> 3) & 0x0f;
|
|
106
|
-
// OBU_SEQUENCE_HEADER (type 1) usually indicates keyframe area
|
|
107
|
-
return obuType === 1;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=ivf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ivf.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/ivf.ts"],"names":[],"mappings":"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"}
|
package/dist/ffmpeg/types.d.ts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FFmpeg configuration types
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* FFmpeg process configuration
|
|
6
|
-
*/
|
|
7
|
-
export interface FFmpegConfig {
|
|
8
|
-
input: FFmpegInputConfig;
|
|
9
|
-
output: FFmpegOutputConfig;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* FFmpeg input configuration
|
|
13
|
-
*/
|
|
14
|
-
export interface FFmpegInputConfig {
|
|
15
|
-
format: string;
|
|
16
|
-
codec?: string;
|
|
17
|
-
width?: number;
|
|
18
|
-
height?: number;
|
|
19
|
-
framerate?: number;
|
|
20
|
-
pixelFormat?: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* FFmpeg output configuration
|
|
24
|
-
*/
|
|
25
|
-
export interface FFmpegOutputConfig {
|
|
26
|
-
format: string;
|
|
27
|
-
codec?: string;
|
|
28
|
-
width?: number;
|
|
29
|
-
height?: number;
|
|
30
|
-
framerate?: number;
|
|
31
|
-
pixelFormat?: string;
|
|
32
|
-
bitrate?: number;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Encoded frame data emitted by parsers
|
|
36
|
-
*/
|
|
37
|
-
export interface EncodedFrameData {
|
|
38
|
-
data: Buffer;
|
|
39
|
-
timestamp: number;
|
|
40
|
-
keyFrame: boolean;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Decoder configuration for FFmpegProcess
|
|
44
|
-
*/
|
|
45
|
-
export interface DecoderConfig {
|
|
46
|
-
codec: string;
|
|
47
|
-
width: number;
|
|
48
|
-
height: number;
|
|
49
|
-
outputPixelFormat?: string;
|
|
50
|
-
hardwareDecoderArgs?: string[];
|
|
51
|
-
hardwareDownloadFilter?: string;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Bitrate mode for encoding
|
|
55
|
-
* - 'constant': Constant bitrate (CBR) - predictable file size, may vary quality
|
|
56
|
-
* - 'variable': Variable bitrate (VBR) - better quality, less predictable size
|
|
57
|
-
* - 'quantizer': Fixed quality mode (CRF/CQ) - consistent quality, variable size
|
|
58
|
-
*/
|
|
59
|
-
export type BitrateMode = 'constant' | 'variable' | 'quantizer';
|
|
60
|
-
/**
|
|
61
|
-
* Alpha channel handling mode
|
|
62
|
-
* - 'discard': Drop alpha channel (default, works with all codecs)
|
|
63
|
-
* - 'keep': Preserve alpha channel (only VP9 and AV1 support this)
|
|
64
|
-
*/
|
|
65
|
-
export type AlphaOption = 'discard' | 'keep';
|
|
66
|
-
/**
|
|
67
|
-
* Encoder configuration for FFmpegProcess
|
|
68
|
-
*/
|
|
69
|
-
export interface EncoderConfig {
|
|
70
|
-
codec: string;
|
|
71
|
-
width: number;
|
|
72
|
-
height: number;
|
|
73
|
-
inputPixelFormat?: string;
|
|
74
|
-
framerate?: number;
|
|
75
|
-
bitrate?: number;
|
|
76
|
-
bitrateMode?: BitrateMode;
|
|
77
|
-
latencyMode?: 'quality' | 'realtime';
|
|
78
|
-
alpha?: AlphaOption;
|
|
79
|
-
hardwareEncoderArgs?: string[];
|
|
80
|
-
}
|
|
81
|
-
/** Default timeout for graceful shutdown (ms) */
|
|
82
|
-
export declare const DEFAULT_SHUTDOWN_TIMEOUT = 5000;
|
|
83
|
-
/** Default timeout for flush operations (ms) */
|
|
84
|
-
export declare const DEFAULT_FLUSH_TIMEOUT = 30000;
|
|
85
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ffmpeg/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACrC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,iDAAiD;AACjD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,QAAQ,CAAC"}
|
package/dist/ffmpeg/types.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FFmpeg configuration types
|
|
3
|
-
*/
|
|
4
|
-
/** Default timeout for graceful shutdown (ms) */
|
|
5
|
-
export const DEFAULT_SHUTDOWN_TIMEOUT = 5000;
|
|
6
|
-
/** Default timeout for flush operations (ms) */
|
|
7
|
-
export const DEFAULT_FLUSH_TIMEOUT = 30000;
|
|
8
|
-
//# sourceMappingURL=types.js.map
|
package/dist/ffmpeg/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ffmpeg/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuFH,iDAAiD;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,gDAAgD;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mediabunny AudioDecoder adapter using node-av backend
|
|
3
|
-
*
|
|
4
|
-
* Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
|
|
5
|
-
* (which wrap FFmpeg's libav* libraries).
|
|
6
|
-
*/
|
|
7
|
-
import { CustomAudioDecoder, EncodedPacket, AudioCodec } from 'mediabunny';
|
|
8
|
-
export declare class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
9
|
-
private backend;
|
|
10
|
-
private frameIndex;
|
|
11
|
-
private resolveFlush;
|
|
12
|
-
private baseTimestamp;
|
|
13
|
-
private hasBaseTimestamp;
|
|
14
|
-
static supports(codec: AudioCodec, _config: AudioDecoderConfig): boolean;
|
|
15
|
-
init(): Promise<void>;
|
|
16
|
-
decode(packet: EncodedPacket): Promise<void>;
|
|
17
|
-
flush(): Promise<void>;
|
|
18
|
-
close(): Promise<void>;
|
|
19
|
-
/**
|
|
20
|
-
* Emit an AudioSample via Mediabunny callback
|
|
21
|
-
*/
|
|
22
|
-
private emitAudioSample;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=FFmpegAudioDecoder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mediabunny AudioDecoder adapter using node-av backend
|
|
3
|
-
*
|
|
4
|
-
* Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
|
|
5
|
-
* (which wrap FFmpeg's libav* libraries).
|
|
6
|
-
*/
|
|
7
|
-
import { CustomAudioDecoder, AudioSample, } from 'mediabunny';
|
|
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',
|
|
31
|
-
};
|
|
32
|
-
export class FFmpegAudioDecoder extends CustomAudioDecoder {
|
|
33
|
-
backend = null;
|
|
34
|
-
frameIndex = 0;
|
|
35
|
-
resolveFlush = null;
|
|
36
|
-
// Track base timestamp from first input packet
|
|
37
|
-
baseTimestamp = 0;
|
|
38
|
-
hasBaseTimestamp = false;
|
|
39
|
-
static supports(codec, _config) {
|
|
40
|
-
return codec in CODEC_NAME_MAP;
|
|
41
|
-
}
|
|
42
|
-
async init() {
|
|
43
|
-
const sampleRate = this.config.sampleRate ?? 44100;
|
|
44
|
-
const numberOfChannels = this.config.numberOfChannels ?? 2;
|
|
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);
|
|
52
|
-
}
|
|
53
|
-
this.backend.startDecoder({
|
|
54
|
-
codec: codecName,
|
|
55
|
-
sampleRate,
|
|
56
|
-
numberOfChannels,
|
|
57
|
-
description,
|
|
58
|
-
outputFormat: 'f32',
|
|
59
|
-
});
|
|
60
|
-
// Listen for decoded frames
|
|
61
|
-
this.backend.on('frame', (frame) => {
|
|
62
|
-
this.emitAudioSample(frame.data, frame.numberOfFrames);
|
|
63
|
-
});
|
|
64
|
-
this.backend.on('error', (err) => {
|
|
65
|
-
console.error('[FFmpegAudioDecoder] Backend error:', err.message);
|
|
66
|
-
});
|
|
67
|
-
this.backend.on('close', () => {
|
|
68
|
-
if (this.resolveFlush) {
|
|
69
|
-
this.resolveFlush();
|
|
70
|
-
this.resolveFlush = null;
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
async decode(packet) {
|
|
75
|
-
if (!this.backend?.isHealthy) {
|
|
76
|
-
throw new Error('Decoder not initialized');
|
|
77
|
-
}
|
|
78
|
-
// Capture the base timestamp from the first packet
|
|
79
|
-
if (!this.hasBaseTimestamp) {
|
|
80
|
-
this.baseTimestamp = packet.timestamp;
|
|
81
|
-
this.hasBaseTimestamp = true;
|
|
82
|
-
}
|
|
83
|
-
// Write encoded data to backend
|
|
84
|
-
this.backend.write(Buffer.from(packet.data));
|
|
85
|
-
}
|
|
86
|
-
async flush() {
|
|
87
|
-
return new Promise((resolve) => {
|
|
88
|
-
this.resolveFlush = resolve;
|
|
89
|
-
if (this.backend) {
|
|
90
|
-
this.backend.end();
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
resolve();
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
async close() {
|
|
98
|
-
if (this.backend) {
|
|
99
|
-
this.backend.kill();
|
|
100
|
-
this.backend = null;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Emit an AudioSample via Mediabunny callback
|
|
105
|
-
*/
|
|
106
|
-
emitAudioSample(data, numberOfFrames) {
|
|
107
|
-
if (data.length === 0 || numberOfFrames === 0)
|
|
108
|
-
return;
|
|
109
|
-
const sampleRate = this.config.sampleRate ?? 44100;
|
|
110
|
-
const numberOfChannels = this.config.numberOfChannels ?? 2;
|
|
111
|
-
// Calculate timestamp in seconds, preserving base timestamp from input
|
|
112
|
-
const offsetSeconds = this.frameIndex / sampleRate;
|
|
113
|
-
const timestampSeconds = this.baseTimestamp + offsetSeconds;
|
|
114
|
-
// Create AudioSample from raw f32 interleaved data
|
|
115
|
-
const sample = new AudioSample({
|
|
116
|
-
format: 'f32',
|
|
117
|
-
sampleRate,
|
|
118
|
-
numberOfChannels,
|
|
119
|
-
timestamp: timestampSeconds,
|
|
120
|
-
data: new Uint8Array(data),
|
|
121
|
-
});
|
|
122
|
-
this.frameIndex += numberOfFrames;
|
|
123
|
-
this.onSample(sample);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=FFmpegAudioDecoder.js.map
|