@remotion/webcodecs 4.0.321 → 4.0.323

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.
@@ -5652,6 +5652,7 @@ var internalExtractFrames = ({
5652
5652
  return async (sample) => {
5653
5653
  const nextTimestampWeWant = timestampTargets[0];
5654
5654
  if (sample.type === "key") {
5655
+ await decoder.flush();
5655
5656
  queued.length = 0;
5656
5657
  }
5657
5658
  queued.push(sample);
@@ -64,6 +64,7 @@ const internalExtractFrames = ({ src, onFrame, signal, timestampsInSeconds, ackn
64
64
  return async (sample) => {
65
65
  const nextTimestampWeWant = timestampTargets[0];
66
66
  if (sample.type === 'key') {
67
+ await decoder.flush();
67
68
  queued.length = 0;
68
69
  }
69
70
  queued.push(sample);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/webcodecs",
3
- "version": "4.0.321",
3
+ "version": "4.0.323",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/esm/index.mjs",
@@ -19,8 +19,8 @@
19
19
  "author": "Jonny Burger <jonny@remotion.dev>",
20
20
  "license": "Remotion License (See https://remotion.dev/docs/webcodecs#license)",
21
21
  "dependencies": {
22
- "@remotion/media-parser": "4.0.321",
23
- "@remotion/licensing": "4.0.321"
22
+ "@remotion/licensing": "4.0.323",
23
+ "@remotion/media-parser": "4.0.323"
24
24
  },
25
25
  "peerDependencies": {},
26
26
  "devDependencies": {
@@ -29,8 +29,8 @@
29
29
  "vite": "5.4.19",
30
30
  "@playwright/test": "1.51.1",
31
31
  "eslint": "9.19.0",
32
- "@remotion/example-videos": "4.0.321",
33
- "@remotion/eslint-config-internal": "4.0.321"
32
+ "@remotion/example-videos": "4.0.323",
33
+ "@remotion/eslint-config-internal": "4.0.323"
34
34
  },
35
35
  "keywords": [],
36
36
  "publishConfig": {
@@ -1,2 +0,0 @@
1
- import type { MediaFn, MediaFnGeneratorInput } from '../media-fn';
2
- export declare const createMp3: ({ filename, logLevel, onBytesProgress, onMillisecondsProgress, writer, progressTracker, }: MediaFnGeneratorInput) => Promise<MediaFn>;
@@ -1,79 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMp3 = void 0;
4
- const log_1 = require("../../log");
5
- // ID3v2 header constants
6
- const ID3V2_HEADER = new Uint8Array([0x49, 0x44, 0x33]); // "ID3"
7
- const ID3V2_VERSION = new Uint8Array([0x03, 0x00]); // Version 2.3.0
8
- const ID3V2_FLAGS = new Uint8Array([0x00]); // No flags
9
- const encodeSyncSafeInt32 = (value) => {
10
- return new Uint8Array([
11
- (value >> 21) & 0x7f,
12
- (value >> 14) & 0x7f,
13
- (value >> 7) & 0x7f,
14
- value & 0x7f,
15
- ]);
16
- };
17
- const createId3V2Header = (dataSize) => {
18
- const header = new Uint8Array(10);
19
- header.set(ID3V2_HEADER, 0);
20
- header.set(ID3V2_VERSION, 3);
21
- header.set(ID3V2_FLAGS, 5);
22
- header.set(encodeSyncSafeInt32(dataSize), 6);
23
- return header;
24
- };
25
- const createMp3 = async ({ filename, logLevel, onBytesProgress, onMillisecondsProgress, writer, progressTracker, }) => {
26
- const w = await writer.createContent({
27
- filename,
28
- mimeType: 'audio/mpeg',
29
- logLevel,
30
- });
31
- // Write minimal ID3v2 header (10 bytes header + 0 bytes data)
32
- const id3Header = createId3V2Header(0);
33
- await w.write(id3Header);
34
- const operationProm = { current: Promise.resolve() };
35
- const addSample = async (chunk) => {
36
- log_1.Log.trace(logLevel, 'Adding MP3 sample', chunk);
37
- // Write the raw audio data (assuming it's already MP3-encoded)
38
- await w.write(chunk.data);
39
- onMillisecondsProgress((chunk.timestamp + (chunk.duration ?? 0)) / 1000);
40
- onBytesProgress(w.getWrittenByteCount());
41
- };
42
- const waitForFinishPromises = [];
43
- return {
44
- getBlob: () => {
45
- return w.getBlob();
46
- },
47
- remove: () => {
48
- return w.remove();
49
- },
50
- addSample: ({ chunk, trackNumber }) => {
51
- if (trackNumber !== 1) {
52
- throw new Error('Only one track supported for MP3');
53
- }
54
- operationProm.current = operationProm.current.then(() => addSample(chunk));
55
- progressTracker.updateTrackProgress(trackNumber, chunk.timestamp);
56
- return operationProm.current;
57
- },
58
- updateTrackSampleRate: () => {
59
- // MP3 sample rate is encoded in the frame headers, so no separate update needed
60
- },
61
- addWaitForFinishPromise: (promise) => {
62
- waitForFinishPromises.push(promise);
63
- },
64
- async waitForFinish() {
65
- log_1.Log.verbose(logLevel, 'All MP3 write operations queued. Waiting for finish...');
66
- await Promise.all(waitForFinishPromises.map((p) => p()));
67
- await operationProm.current;
68
- await w.finish();
69
- },
70
- addTrack: async (track) => {
71
- if (track.type !== 'audio') {
72
- throw new Error('Only audio tracks supported for MP3');
73
- }
74
- progressTracker.registerTrack(1);
75
- return Promise.resolve({ trackNumber: 1 });
76
- },
77
- };
78
- };
79
- exports.createMp3 = createMp3;