playsvideo 0.0.10 → 0.2.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.
Files changed (34) hide show
  1. package/dist/adapters/wasm-ffmpeg.d.ts +21 -0
  2. package/dist/adapters/wasm-ffmpeg.d.ts.map +1 -0
  3. package/dist/adapters/wasm-ffmpeg.js +103 -0
  4. package/dist/adapters/wasm-ffmpeg.js.map +1 -0
  5. package/dist/engine.d.ts +12 -1
  6. package/dist/engine.d.ts.map +1 -1
  7. package/dist/engine.js +49 -13
  8. package/dist/engine.js.map +1 -1
  9. package/dist/index.d.ts +3 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/pipeline/audio-transcode.d.ts +49 -2
  14. package/dist/pipeline/audio-transcode.d.ts.map +1 -1
  15. package/dist/pipeline/audio-transcode.js +204 -98
  16. package/dist/pipeline/audio-transcode.js.map +1 -1
  17. package/dist/pipeline/segment-plan.d.ts.map +1 -1
  18. package/dist/pipeline/segment-plan.js +4 -2
  19. package/dist/pipeline/segment-plan.js.map +1 -1
  20. package/dist/pipeline/segment-processor.d.ts +3 -2
  21. package/dist/pipeline/segment-processor.d.ts.map +1 -1
  22. package/dist/pipeline/segment-processor.js +2 -4
  23. package/dist/pipeline/segment-processor.js.map +1 -1
  24. package/dist/transcode-protocol.d.ts +29 -0
  25. package/dist/transcode-protocol.d.ts.map +1 -0
  26. package/dist/transcode-protocol.js +2 -0
  27. package/dist/transcode-protocol.js.map +1 -0
  28. package/dist/transcode-worker.d.ts +2 -0
  29. package/dist/transcode-worker.d.ts.map +1 -0
  30. package/dist/transcode-worker.js +49 -0
  31. package/dist/transcode-worker.js.map +1 -0
  32. package/dist/vendor/ffmpeg-core-audio/ffmpeg-core.js +16 -0
  33. package/dist/vendor/ffmpeg-core-audio/ffmpeg-core.wasm +0 -0
  34. package/package.json +2 -3
@@ -1,7 +1,10 @@
1
1
  import { EncodedPacket } from 'mediabunny';
2
2
  import { parseAdtsFrames } from './adts-parse.js';
3
3
  const SAMPLES_PER_AAC_FRAME = 1024;
4
- const OUTPUT_NAME = 'transcode-output.aac';
4
+ const DEFAULT_OUTPUT_SAMPLE_RATE = 48000;
5
+ const DEFAULT_OUTPUT_CHANNELS = 2;
6
+ const runnerLocks = new WeakMap();
7
+ let transcodeJobCounter = 0;
5
8
  /** Map short codec names to ffmpeg input format (-f) flags. */
6
9
  const INPUT_FORMAT = {
7
10
  ac3: 'ac3',
@@ -11,6 +14,13 @@ const INPUT_FORMAT = {
11
14
  flac: 'flac',
12
15
  opus: 'ogg',
13
16
  };
17
+ export function makeAacDecoderConfig(sourceConfig) {
18
+ return {
19
+ codec: 'mp4a.40.2',
20
+ numberOfChannels: DEFAULT_OUTPUT_CHANNELS,
21
+ sampleRate: sourceConfig?.sampleRate ?? DEFAULT_OUTPUT_SAMPLE_RATE,
22
+ };
23
+ }
14
24
  /** Parse ffmpeg's final stats line for speed and time values. */
15
25
  function parseFfmpegStats(stderr) {
16
26
  const speedMatch = stderr.match(/speed=\s*([\d.]+)x/);
@@ -28,87 +38,82 @@ function parseFfmpegStats(stderr) {
28
38
  function now() {
29
39
  return performance.now();
30
40
  }
31
- export async function transcodeAudioSegment(opts) {
32
- if (opts.packets.length === 0) {
33
- return {
34
- packets: [],
35
- decoderConfig: { codec: 'mp4a.40.2', numberOfChannels: 2, sampleRate: opts.sampleRate },
36
- metrics: {
37
- inputPackets: 0,
38
- inputBytes: 0,
39
- audioDurationSec: 0,
40
- concatMs: 0,
41
- writeMs: 0,
42
- ffmpegMs: 0,
43
- readMs: 0,
44
- cleanupMs: 0,
45
- parseMs: 0,
46
- totalMs: 0,
47
- outputPackets: 0,
48
- outputBytes: 0,
49
- outputDurationSec: 0,
50
- ffmpegSpeed: null,
51
- ffmpegTimeMs: null,
52
- realtimeRatio: 0,
53
- },
54
- };
41
+ function nextTranscodeJobId() {
42
+ transcodeJobCounter += 1;
43
+ return transcodeJobCounter;
44
+ }
45
+ function getRunnerLockState(runner) {
46
+ let state = runnerLocks.get(runner);
47
+ if (!state) {
48
+ state = { tail: Promise.resolve() };
49
+ runnerLocks.set(runner, state);
55
50
  }
56
- const tTotal = now();
57
- // Concatenate source audio packets into raw bitstream
58
- const tConcat = now();
59
- const totalSize = opts.packets.reduce((sum, p) => sum + p.data.byteLength, 0);
60
- const rawAudio = new Uint8Array(totalSize);
51
+ return state;
52
+ }
53
+ async function withRunnerLock(runner, fn) {
54
+ const state = getRunnerLockState(runner);
55
+ const previous = state.tail;
56
+ let release;
57
+ state.tail = new Promise((resolve) => {
58
+ release = resolve;
59
+ });
60
+ await previous;
61
+ try {
62
+ return await fn();
63
+ }
64
+ finally {
65
+ release();
66
+ }
67
+ }
68
+ export function createLocalAudioTranscoder(ffmpeg) {
69
+ return (opts) => transcodeAudioSegment({ ...opts, ffmpeg });
70
+ }
71
+ export function createEmptyTranscodeResult(sampleRate) {
72
+ return {
73
+ packets: [],
74
+ decoderConfig: makeAacDecoderConfig({
75
+ codec: 'mp4a.40.2',
76
+ numberOfChannels: DEFAULT_OUTPUT_CHANNELS,
77
+ sampleRate,
78
+ }),
79
+ metrics: {
80
+ inputPackets: 0,
81
+ inputBytes: 0,
82
+ audioDurationSec: 0,
83
+ concatMs: 0,
84
+ writeMs: 0,
85
+ ffmpegMs: 0,
86
+ readMs: 0,
87
+ cleanupMs: 0,
88
+ parseMs: 0,
89
+ totalMs: 0,
90
+ outputPackets: 0,
91
+ outputBytes: 0,
92
+ outputDurationSec: 0,
93
+ ffmpegSpeed: null,
94
+ ffmpegTimeMs: null,
95
+ realtimeRatio: 0,
96
+ },
97
+ };
98
+ }
99
+ export function concatEncodedPacketData(packets) {
100
+ const inputBytes = packets.reduce((sum, p) => sum + p.data.byteLength, 0);
101
+ const data = new Uint8Array(inputBytes);
61
102
  let offset = 0;
62
- for (const pkt of opts.packets) {
63
- rawAudio.set(pkt.data, offset);
103
+ for (const pkt of packets) {
104
+ data.set(pkt.data, offset);
64
105
  offset += pkt.data.byteLength;
65
106
  }
66
- const concatMs = now() - tConcat;
67
- const firstPkt = opts.packets[0];
68
- const lastPkt = opts.packets[opts.packets.length - 1];
107
+ const firstPkt = packets[0];
108
+ const lastPkt = packets[packets.length - 1];
69
109
  const audioDurationSec = lastPkt.timestamp + lastPkt.duration - firstPkt.timestamp;
70
- const codec = opts.sourceCodec ?? 'ac3';
71
- const inputFormat = INPUT_FORMAT[codec] ?? codec;
72
- const inputName = `transcode-input.${inputFormat}`;
73
- const tWrite = now();
74
- await opts.ffmpeg.writeInput(inputName, rawAudio);
75
- const writeMs = now() - tWrite;
76
- const tFfmpeg = now();
77
- const result = await opts.ffmpeg.run([
78
- '-hide_banner',
79
- '-loglevel',
80
- 'info',
81
- '-f',
82
- inputFormat,
83
- '-i',
84
- inputName,
85
- '-c:a',
86
- 'aac',
87
- '-ac',
88
- '2',
89
- '-b:a',
90
- '160k',
91
- '-f',
92
- 'adts',
93
- '-y',
94
- OUTPUT_NAME,
95
- ]);
96
- const ffmpegMs = now() - tFfmpeg;
97
- if (result.exitCode !== 0) {
98
- throw new Error(`Audio transcode failed: ${result.stderr}`);
99
- }
100
- const { speed: ffmpegSpeed, timeMs: ffmpegTimeMs } = parseFfmpegStats(result.stderr);
101
- const tRead = now();
102
- const aacData = await opts.ffmpeg.readOutput(OUTPUT_NAME);
103
- const readMs = now() - tRead;
104
- const tCleanup = now();
105
- await opts.ffmpeg.deleteFile?.(inputName);
106
- await opts.ffmpeg.deleteFile?.(OUTPUT_NAME);
107
- const cleanupMs = now() - tCleanup;
110
+ return { data, inputBytes, audioDurationSec };
111
+ }
112
+ export function packetsFromAdtsData(aacData, sampleRate, audioStartSec) {
108
113
  const tParse = now();
109
114
  const frames = parseAdtsFrames(aacData);
110
- const frameDuration = SAMPLES_PER_AAC_FRAME / opts.sampleRate;
111
- let timestamp = opts.audioStartSec;
115
+ const frameDuration = SAMPLES_PER_AAC_FRAME / sampleRate;
116
+ let timestamp = audioStartSec;
112
117
  const packets = frames.map((frame, i) => {
113
118
  const pkt = new EncodedPacket(frame.data, 'key', // all AAC frames are keyframes
114
119
  timestamp, frameDuration, i);
@@ -116,32 +121,133 @@ export async function transcodeAudioSegment(opts) {
116
121
  return pkt;
117
122
  });
118
123
  const parseMs = now() - tParse;
119
- const totalMs = now() - tTotal;
120
- const outputBytes = aacData.byteLength;
121
- const outputDurationSec = frames.length * frameDuration;
122
- const decoderConfig = {
123
- codec: 'mp4a.40.2', // AAC-LC
124
- numberOfChannels: frames[0]?.channels ?? 2,
125
- sampleRate: frames[0]?.sampleRate ?? opts.sampleRate,
124
+ return {
125
+ packets,
126
+ decoderConfig: {
127
+ codec: 'mp4a.40.2', // AAC-LC
128
+ numberOfChannels: frames[0]?.channels ?? DEFAULT_OUTPUT_CHANNELS,
129
+ sampleRate: frames[0]?.sampleRate ?? sampleRate,
130
+ },
131
+ parseMs,
132
+ outputBytes: aacData.byteLength,
133
+ outputDurationSec: frames.length * frameDuration,
126
134
  };
135
+ }
136
+ export function buildTranscodeResultFromAdts(params) {
137
+ const parsed = packetsFromAdtsData(params.aacData, params.sampleRate, params.audioStartSec);
127
138
  const metrics = {
139
+ inputPackets: params.inputPackets,
140
+ inputBytes: params.inputBytes,
141
+ audioDurationSec: params.audioDurationSec,
142
+ concatMs: params.concatMs,
143
+ writeMs: params.ffmpegMetrics.writeMs,
144
+ ffmpegMs: params.ffmpegMetrics.ffmpegMs,
145
+ readMs: params.ffmpegMetrics.readMs,
146
+ cleanupMs: params.ffmpegMetrics.cleanupMs,
147
+ parseMs: parsed.parseMs,
148
+ totalMs: params.totalMs,
149
+ outputPackets: parsed.packets.length,
150
+ outputBytes: parsed.outputBytes,
151
+ outputDurationSec: parsed.outputDurationSec,
152
+ ffmpegSpeed: params.ffmpegMetrics.ffmpegSpeed,
153
+ ffmpegTimeMs: params.ffmpegMetrics.ffmpegTimeMs,
154
+ realtimeRatio: params.audioDurationSec > 0 ? params.totalMs / (params.audioDurationSec * 1000) : 0,
155
+ };
156
+ return {
157
+ packets: parsed.packets,
158
+ decoderConfig: parsed.decoderConfig,
159
+ metrics,
160
+ };
161
+ }
162
+ export async function runFfmpegAudioTranscode(opts) {
163
+ const codec = opts.sourceCodec ?? 'ac3';
164
+ const inputFormat = INPUT_FORMAT[codec] ?? codec;
165
+ const jobId = nextTranscodeJobId();
166
+ const inputName = `transcode-input-${jobId}.${inputFormat}`;
167
+ const outputName = `transcode-output-${jobId}.aac`;
168
+ let writeMs = 0;
169
+ let ffmpegMs = 0;
170
+ let readMs = 0;
171
+ let cleanupMs = 0;
172
+ let ffmpegSpeed = null;
173
+ let ffmpegTimeMs = null;
174
+ let aacData = new Uint8Array(0);
175
+ await withRunnerLock(opts.ffmpeg, async () => {
176
+ try {
177
+ const tWrite = now();
178
+ await opts.ffmpeg.writeInput(inputName, opts.inputData);
179
+ writeMs = now() - tWrite;
180
+ const tFfmpeg = now();
181
+ const result = await opts.ffmpeg.run([
182
+ '-hide_banner',
183
+ '-loglevel',
184
+ 'info',
185
+ '-f',
186
+ inputFormat,
187
+ '-i',
188
+ inputName,
189
+ '-c:a',
190
+ 'aac',
191
+ '-ac',
192
+ String(DEFAULT_OUTPUT_CHANNELS),
193
+ '-b:a',
194
+ '160k',
195
+ '-f',
196
+ 'adts',
197
+ '-y',
198
+ outputName,
199
+ ]);
200
+ ffmpegMs = now() - tFfmpeg;
201
+ if (result.exitCode !== 0) {
202
+ throw new Error(`Audio transcode failed: ${result.stderr}`);
203
+ }
204
+ ({ speed: ffmpegSpeed, timeMs: ffmpegTimeMs } = parseFfmpegStats(result.stderr));
205
+ const tRead = now();
206
+ aacData = await opts.ffmpeg.readOutput(outputName);
207
+ readMs = now() - tRead;
208
+ }
209
+ finally {
210
+ const tCleanup = now();
211
+ await opts.ffmpeg.deleteFile?.(inputName);
212
+ await opts.ffmpeg.deleteFile?.(outputName);
213
+ cleanupMs = now() - tCleanup;
214
+ }
215
+ });
216
+ return {
217
+ aacData,
218
+ metrics: {
219
+ writeMs,
220
+ ffmpegMs,
221
+ readMs,
222
+ cleanupMs,
223
+ ffmpegSpeed,
224
+ ffmpegTimeMs,
225
+ },
226
+ };
227
+ }
228
+ export async function transcodeAudioSegment(opts) {
229
+ if (opts.packets.length === 0) {
230
+ return createEmptyTranscodeResult(opts.sampleRate);
231
+ }
232
+ const tTotal = now();
233
+ const tConcat = now();
234
+ const input = concatEncodedPacketData(opts.packets);
235
+ const concatMs = now() - tConcat;
236
+ const raw = await runFfmpegAudioTranscode({
237
+ ffmpeg: opts.ffmpeg,
238
+ inputData: input.data,
239
+ sourceCodec: opts.sourceCodec,
240
+ });
241
+ return buildTranscodeResultFromAdts({
128
242
  inputPackets: opts.packets.length,
129
- inputBytes: totalSize,
130
- audioDurationSec,
243
+ inputBytes: input.inputBytes,
244
+ audioDurationSec: input.audioDurationSec,
131
245
  concatMs,
132
- writeMs,
133
- ffmpegMs,
134
- readMs,
135
- cleanupMs,
136
- parseMs,
137
- totalMs,
138
- outputPackets: packets.length,
139
- outputBytes,
140
- outputDurationSec,
141
- ffmpegSpeed,
142
- ffmpegTimeMs,
143
- realtimeRatio: audioDurationSec > 0 ? totalMs / (audioDurationSec * 1000) : 0,
144
- };
145
- return { packets, decoderConfig, metrics };
246
+ sampleRate: opts.sampleRate,
247
+ audioStartSec: opts.audioStartSec,
248
+ aacData: raw.aacData,
249
+ ffmpegMetrics: raw.metrics,
250
+ totalMs: now() - tTotal,
251
+ });
146
252
  }
147
253
  //# sourceMappingURL=audio-transcode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-transcode.js","sourceRoot":"","sources":["../../src/pipeline/audio-transcode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-transcode.js","sourceRoot":"","sources":["../../src/pipeline/audio-transcode.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"segment-plan.d.ts","sourceRoot":"","sources":["../../src/pipeline/segment-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAkCV;AAED,MAAM,WAAW,uBAAuB;IACtC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,cAAc,EAAE,CAyBnF"}
1
+ {"version":3,"file":"segment-plan.d.ts","sourceRoot":"","sources":["../../src/pipeline/segment-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAkCV;AAED,MAAM,WAAW,uBAAuB;IACtC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,cAAc,EAAE,CA2BnF"}
@@ -9,7 +9,7 @@ export function normalizeKeyframeTimestamps(timestampsSec, durationSec) {
9
9
  .filter((v) => Number.isFinite(v) && v >= 0 && v <= duration + EPSILON_SEC)
10
10
  .map((v) => Math.max(0, Math.min(duration, v)))
11
11
  .sort((a, b) => a - b);
12
- if (!normalized.length || normalized[0] > EPSILON_SEC) {
12
+ if (!normalized.length) {
13
13
  normalized.unshift(0);
14
14
  }
15
15
  const deduped = [];
@@ -39,7 +39,9 @@ export function buildSegmentPlan(options) {
39
39
  // ffmpeg cuts at each keyframe regardless of hls_time; the target duration
40
40
  // only affects the M3U8 EXT-X-TARGETDURATION header, not segment boundaries.
41
41
  for (let i = 0; i < boundaries.length - 1; i++) {
42
- const startSec = boundaries[i];
42
+ // Segment 0 always starts at 0 so the HLS playlist covers the full
43
+ // duration, even when the first video keyframe is slightly after 0.
44
+ const startSec = i === 0 ? 0 : boundaries[i];
43
45
  const endSec = boundaries[i + 1];
44
46
  const duration = Math.max(EPSILON_SEC, endSec - startSec);
45
47
  plan.push({
@@ -1 +1 @@
1
- {"version":3,"file":"segment-plan.js","sourceRoot":"","sources":["../../src/pipeline/segment-plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"segment-plan.js","sourceRoot":"","sources":["../../src/pipeline/segment-plan.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { EncodedPacketSink } from 'mediabunny';
2
- import type { FfmpegRunner, PlannedSegment } from './types.js';
2
+ import type { AudioTranscodeExecutor } from './audio-transcode.js';
3
+ import type { PlannedSegment } from './types.js';
3
4
  export interface SegmentProcessorConfig {
4
5
  videoSink: EncodedPacketSink;
5
6
  audioSink: EncodedPacketSink | null;
@@ -9,7 +10,7 @@ export interface SegmentProcessorConfig {
9
10
  audioDecoderConfig: AudioDecoderConfig | null;
10
11
  plan: PlannedSegment[];
11
12
  doTranscode: boolean;
12
- ffmpeg: FfmpegRunner;
13
+ transcodeAudio: AudioTranscodeExecutor;
13
14
  sourceCodec?: string;
14
15
  log?: (msg: string) => void;
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segment-processor.d.ts","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,yDAAyD;IACzD,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAMD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CA8EjC"}
1
+ {"version":3,"file":"segment-processor.d.ts","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,sBAAsB,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,yDAAyD;IACzD,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAMD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAgFjC"}
@@ -1,4 +1,3 @@
1
- import { transcodeAudioSegment } from './audio-transcode.js';
2
1
  import { collectPacketsInRange } from './demux.js';
3
2
  import { muxToFmp4 } from './mux.js';
4
3
  import { checkAbort } from './source-signal.js';
@@ -37,13 +36,12 @@ export async function processSegmentWithAbort(config, index, signal) {
37
36
  let audioDecoderConfig = config.audioDecoderConfig;
38
37
  if (config.doTranscode && audioPackets.length > 0) {
39
38
  const sampleRate = config.audioDecoderConfig?.sampleRate ?? 48000;
40
- const transcoded = await transcodeAudioSegment({
39
+ const transcoded = await config.transcodeAudio({
41
40
  packets: audioPackets,
42
41
  sampleRate,
43
42
  audioStartSec: audioPackets[0].timestamp,
44
- ffmpeg: config.ffmpeg,
45
43
  sourceCodec: config.sourceCodec,
46
- });
44
+ }, signal);
47
45
  const m = transcoded.metrics;
48
46
  const speed = m.ffmpegSpeed !== null ? ` speed=${m.ffmpegSpeed}x` : '';
49
47
  log(`seg ${index} transcode ${m.totalMs.toFixed(1)}ms audio=${m.audioDurationSec.toFixed(2)}s ratio=${m.realtimeRatio.toFixed(4)}x ffmpeg=${m.ffmpegMs.toFixed(1)}ms${speed}`);
@@ -1 +1 @@
1
- {"version":3,"file":"segment-processor.js","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"segment-processor.js","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { FfmpegTranscodeMetrics } from './pipeline/audio-transcode.js';
2
+ export interface ConnectTranscodeWorkerMessage {
3
+ type: 'connect';
4
+ }
5
+ export interface TranscodePortMessage {
6
+ type: 'transcode-port';
7
+ id: number;
8
+ }
9
+ export interface TranscodeJobRequest {
10
+ type: 'transcode-job';
11
+ jobId: number;
12
+ inputData: ArrayBuffer;
13
+ sourceCodec?: string;
14
+ }
15
+ export interface TranscodeJobSuccess {
16
+ type: 'transcode-result';
17
+ jobId: number;
18
+ ok: true;
19
+ outputData: ArrayBuffer;
20
+ metrics: FfmpegTranscodeMetrics;
21
+ }
22
+ export interface TranscodeJobFailure {
23
+ type: 'transcode-result';
24
+ jobId: number;
25
+ ok: false;
26
+ error: string;
27
+ }
28
+ export type TranscodeJobResponse = TranscodeJobSuccess | TranscodeJobFailure;
29
+ //# sourceMappingURL=transcode-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode-protocol.d.ts","sourceRoot":"","sources":["../src/transcode-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,IAAI,CAAC;IACT,UAAU,EAAE,WAAW,CAAC;IACxB,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transcode-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode-protocol.js","sourceRoot":"","sources":["../src/transcode-protocol.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transcode-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode-worker.d.ts","sourceRoot":"","sources":["../src/transcode-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { WasmFfmpegRunner } from './adapters/wasm-ffmpeg.js';
2
+ import { runFfmpegAudioTranscode } from './pipeline/audio-transcode.js';
3
+ const ffmpeg = new WasmFfmpegRunner();
4
+ let port = null;
5
+ self.onmessage = (event) => {
6
+ if (event.data?.type !== 'connect' || event.ports.length === 0) {
7
+ return;
8
+ }
9
+ port = event.ports[0];
10
+ port.onmessage = (messageEvent) => {
11
+ void handleJob(messageEvent.data);
12
+ };
13
+ port.start?.();
14
+ };
15
+ async function handleJob(msg) {
16
+ if (!port || msg.type !== 'transcode-job') {
17
+ return;
18
+ }
19
+ try {
20
+ if (msg.sourceCodec) {
21
+ await ffmpeg.loadForCodec(msg.sourceCodec);
22
+ }
23
+ const result = await runFfmpegAudioTranscode({
24
+ ffmpeg,
25
+ inputData: new Uint8Array(msg.inputData),
26
+ sourceCodec: msg.sourceCodec,
27
+ });
28
+ const outputData = new Uint8Array(result.aacData);
29
+ const outputBuffer = outputData.buffer;
30
+ const response = {
31
+ type: 'transcode-result',
32
+ jobId: msg.jobId,
33
+ ok: true,
34
+ outputData: outputBuffer,
35
+ metrics: result.metrics,
36
+ };
37
+ port.postMessage(response, [outputBuffer]);
38
+ }
39
+ catch (err) {
40
+ const response = {
41
+ type: 'transcode-result',
42
+ jobId: msg.jobId,
43
+ ok: false,
44
+ error: String(err),
45
+ };
46
+ port.postMessage(response);
47
+ }
48
+ }
49
+ //# sourceMappingURL=transcode-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode-worker.js","sourceRoot":"","sources":["../src/transcode-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAOxE,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACtC,IAAI,IAAI,GAAuB,IAAI,CAAC;AAEpC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAkD,EAAE,EAAE;IACtE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,GAAG,CAAC,YAA+C,EAAE,EAAE;QACnE,KAAK,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AACjB,CAAC,CAAC;AAEF,KAAK,UAAU,SAAS,CAAC,GAAwB;IAC/C,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;YAC3C,MAAM;YACN,SAAS,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;YACxC,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;QACvC,MAAM,QAAQ,GAAyB;YACrC,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,YAAY;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAyB;YACrC,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}