@remotion/media-parser 4.0.191 → 4.0.193

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 (66) hide show
  1. package/boxes.json +1 -0
  2. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +21 -0
  3. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +62 -0
  4. package/dist/boxes/iso-base-media/esds/esds.d.ts +15 -0
  5. package/dist/boxes/iso-base-media/esds/esds.js +27 -0
  6. package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
  7. package/dist/boxes/iso-base-media/ftype.js +31 -0
  8. package/dist/boxes/iso-base-media/mdhd.d.ts +14 -0
  9. package/dist/boxes/iso-base-media/mdhd.js +33 -0
  10. package/dist/boxes/iso-base-media/process-box.js +30 -0
  11. package/dist/boxes/iso-base-media/stsd/samples.d.ts +2 -0
  12. package/dist/boxes/iso-base-media/stsd/samples.js +28 -8
  13. package/dist/boxes/webm/parse-webm-header.js +4 -4
  14. package/dist/boxes/webm/segments/track-entry.d.ts +30 -0
  15. package/dist/boxes/webm/segments/track-entry.js +59 -8
  16. package/dist/boxes/webm/segments.d.ts +2 -2
  17. package/dist/boxes/webm/segments.js +18 -0
  18. package/dist/buffer-iterator.d.ts +2 -1
  19. package/dist/buffer-iterator.js +29 -8
  20. package/dist/from-node.js +6 -2
  21. package/dist/from-web.js +6 -1
  22. package/dist/get-audio-codec.d.ts +4 -0
  23. package/dist/get-audio-codec.js +106 -0
  24. package/dist/get-dimensions.js +6 -2
  25. package/dist/get-fps.d.ts +8 -0
  26. package/dist/get-fps.js +117 -9
  27. package/dist/get-video-codec.d.ts +4 -0
  28. package/dist/get-video-codec.js +79 -0
  29. package/dist/get-video-metadata.d.ts +2 -0
  30. package/dist/get-video-metadata.js +44 -0
  31. package/dist/has-all-info.d.ts +1 -1
  32. package/dist/has-all-info.js +8 -0
  33. package/dist/options.d.ts +11 -3
  34. package/dist/parse-media.js +27 -6
  35. package/dist/parse-result.d.ts +3 -1
  36. package/dist/read-and-increment-offset.d.ts +28 -0
  37. package/dist/read-and-increment-offset.js +177 -0
  38. package/dist/reader.d.ts +5 -1
  39. package/package.json +2 -2
  40. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +104 -0
  41. package/src/boxes/iso-base-media/esds/esds.ts +49 -0
  42. package/src/boxes/iso-base-media/mdhd.ts +56 -0
  43. package/src/boxes/iso-base-media/process-box.ts +35 -0
  44. package/src/boxes/iso-base-media/stsd/samples.ts +36 -8
  45. package/src/boxes/webm/parse-webm-header.ts +4 -4
  46. package/src/boxes/webm/segments/track-entry.ts +103 -11
  47. package/src/boxes/webm/segments.ts +43 -1
  48. package/src/buffer-iterator.ts +36 -10
  49. package/src/from-node.ts +6 -4
  50. package/src/from-web.ts +8 -1
  51. package/src/get-audio-codec.ts +143 -0
  52. package/src/get-dimensions.ts +11 -4
  53. package/src/get-fps.ts +175 -9
  54. package/src/get-video-codec.ts +104 -0
  55. package/src/has-all-info.ts +19 -2
  56. package/src/options.ts +43 -3
  57. package/src/parse-media.ts +35 -7
  58. package/src/parse-result.ts +5 -1
  59. package/src/reader.ts +5 -1
  60. package/src/test/matroska.test.ts +6 -7
  61. package/src/test/parse-esds.test.ts +75 -0
  62. package/src/test/parse-webm.test.ts +2 -0
  63. package/src/test/stream-local.test.ts +93 -5
  64. package/src/test/stream-remote.test.ts +41 -0
  65. package/src/test/stsd.test.ts +52 -5
  66. package/tsconfig.tsbuildinfo +1 -1
@@ -9,17 +9,27 @@ test('Should stream ISO base media', async () => {
9
9
  {
10
10
  durationInSeconds: true,
11
11
  fps: true,
12
+ videoCodec: true,
13
+ audioCodec: true,
12
14
  },
13
15
  nodeReader,
14
16
  );
15
17
  expect(result.durationInSeconds).toBe(12.568333333333333);
16
18
  expect(result.fps).toBe(29.99602174777881);
19
+ expect(result.videoCodec).toBe('h265');
20
+ expect(result.audioCodec).toBe('aac');
17
21
  });
18
22
 
19
23
  test('Should stream WebM with no duration', async () => {
20
24
  const result = await parseMedia(
21
25
  RenderInternals.exampleVideos.nofps,
22
- {fps: true, durationInSeconds: true, dimensions: true},
26
+ {
27
+ fps: true,
28
+ durationInSeconds: true,
29
+ dimensions: true,
30
+ videoCodec: true,
31
+ audioCodec: true,
32
+ },
23
33
  nodeReader,
24
34
  );
25
35
  expect(result.durationInSeconds).toBe(6.57);
@@ -28,6 +38,8 @@ test('Should stream WebM with no duration', async () => {
28
38
  height: 690,
29
39
  });
30
40
  expect(result.fps).toBeDefined();
41
+ expect(result.videoCodec).toBe('vp8');
42
+ expect(result.audioCodec).toBe(null);
31
43
  });
32
44
 
33
45
  test('Should stream AV1 with no duration', async () => {
@@ -37,6 +49,8 @@ test('Should stream AV1 with no duration', async () => {
37
49
  durationInSeconds: true,
38
50
  dimensions: true,
39
51
  fps: true,
52
+ videoCodec: true,
53
+ audioCodec: true,
40
54
  },
41
55
  nodeReader,
42
56
  );
@@ -47,6 +61,8 @@ test('Should stream AV1 with no duration', async () => {
47
61
  width: 1920,
48
62
  height: 1080,
49
63
  });
64
+ expect(parsed.videoCodec).toBe('av1');
65
+ expect(parsed.audioCodec).toBe(null);
50
66
  });
51
67
 
52
68
  test('Should stream corrupted video', async () => {
@@ -56,16 +72,20 @@ test('Should stream corrupted video', async () => {
56
72
  durationInSeconds: true,
57
73
  dimensions: true,
58
74
  fps: true,
75
+ videoCodec: true,
76
+ audioCodec: true,
59
77
  },
60
78
  nodeReader,
61
79
  );
62
80
 
63
81
  expect(parsed.durationInSeconds).toBe(30.03);
64
- expect(parsed.fps).toBe(23.976023976023978);
82
+ expect(parsed.fps).toBe(23.976023976023974);
65
83
  expect(parsed.dimensions).toEqual({
66
84
  width: 1920,
67
85
  height: 1080,
68
86
  });
87
+ expect(parsed.videoCodec).toBe('h264');
88
+ expect(parsed.audioCodec).toBe('aac');
69
89
  });
70
90
 
71
91
  test('Should stream screen recording video', async () => {
@@ -75,17 +95,22 @@ test('Should stream screen recording video', async () => {
75
95
  durationInSeconds: true,
76
96
  dimensions: true,
77
97
  fps: true,
98
+ videoCodec: true,
99
+ audioCodec: true,
78
100
  },
79
101
  nodeReader,
80
102
  );
81
103
 
82
104
  expect(parsed.durationInSeconds).toBe(5.866666666666666);
83
- expect(parsed.fps).toBe(58.98305084745763);
105
+ expect(parsed.fps).toBe(58.983050847457626);
84
106
  expect(parsed.dimensions).toEqual({
85
107
  height: 1766,
86
108
  width: 2874,
87
109
  });
110
+ expect(parsed.videoCodec).toBe('h264');
111
+ expect(parsed.audioCodec).toBe(null);
88
112
  });
113
+
89
114
  test('Should stream ProRes video', async () => {
90
115
  const parsed = await parseMedia(
91
116
  RenderInternals.exampleVideos.prores,
@@ -93,13 +118,76 @@ test('Should stream ProRes video', async () => {
93
118
  fps: true,
94
119
  dimensions: true,
95
120
  durationInSeconds: true,
121
+ videoCodec: true,
122
+ audioCodec: true,
96
123
  },
97
124
  nodeReader,
98
125
  );
99
126
 
100
- // TODO: FPS should be 60
101
- expect(parsed.fps).toBe(3.90625);
127
+ expect(parsed.fps).toBe(60);
102
128
  expect(parsed.dimensions.width).toBe(1920);
103
129
  expect(parsed.dimensions.height).toBe(1080);
104
130
  expect(parsed.durationInSeconds).toBe(0.034);
131
+ expect(parsed.videoCodec).toBe('prores');
132
+ expect(parsed.audioCodec).toBe('aiff');
133
+ });
134
+
135
+ test('Should stream variable fps video', async () => {
136
+ const parsed = await parseMedia(
137
+ RenderInternals.exampleVideos.variablefps,
138
+ {
139
+ fps: true,
140
+ dimensions: true,
141
+ durationInSeconds: true,
142
+ videoCodec: true,
143
+ audioCodec: true,
144
+ },
145
+ nodeReader,
146
+ );
147
+
148
+ expect(parsed.dimensions.width).toBe(1280);
149
+ expect(parsed.dimensions.height).toBe(720);
150
+ expect(parsed.durationInSeconds).toBe(22.901);
151
+ expect(parsed.videoCodec).toBe('vp8');
152
+ expect(parsed.audioCodec).toBe('opus');
153
+ });
154
+
155
+ test('Should stream MKV video', async () => {
156
+ const parsed = await parseMedia(
157
+ RenderInternals.exampleVideos.matroskaPcm16,
158
+ {
159
+ fps: true,
160
+ dimensions: true,
161
+ durationInSeconds: true,
162
+ videoCodec: true,
163
+ audioCodec: true,
164
+ },
165
+ nodeReader,
166
+ );
167
+
168
+ expect(parsed.dimensions.width).toBe(1080);
169
+ expect(parsed.dimensions.height).toBe(1080);
170
+ expect(parsed.durationInSeconds).toBe(0.333);
171
+ expect(parsed.videoCodec).toBe('h264');
172
+ expect(parsed.audioCodec).toBe('pcm');
173
+ });
174
+
175
+ test('Should stream MP3 in MP4 video', async () => {
176
+ const parsed = await parseMedia(
177
+ RenderInternals.exampleVideos.mp4withmp3,
178
+ {
179
+ fps: true,
180
+ dimensions: true,
181
+ durationInSeconds: true,
182
+ videoCodec: true,
183
+ audioCodec: true,
184
+ },
185
+ nodeReader,
186
+ );
187
+
188
+ expect(parsed.dimensions.width).toBe(1080);
189
+ expect(parsed.dimensions.height).toBe(1080);
190
+ expect(parsed.durationInSeconds).toBe(0.337);
191
+ expect(parsed.videoCodec).toBe('h264');
192
+ expect(parsed.audioCodec).toBe('mp3');
105
193
  });
@@ -6,7 +6,48 @@ test('Should stream', async () => {
6
6
  'https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_1MB.mp4',
7
7
  {
8
8
  durationInSeconds: true,
9
+ fps: true,
10
+ dimensions: true,
11
+ videoCodec: true,
9
12
  },
10
13
  );
11
14
  expect(result.durationInSeconds).toBe(10);
15
+ expect(result.fps).toBe(60);
16
+ expect(result.dimensions).toEqual({
17
+ width: 1920,
18
+ height: 1080,
19
+ });
20
+ expect(result.videoCodec).toEqual('h264');
21
+ });
22
+
23
+ test('Should stream from Wikipedia', async () => {
24
+ const result = await parseMedia(
25
+ 'https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c0/Big_Buck_Bunny_4K.webm/Big_Buck_Bunny_4K.webm.720p.vp9.webm',
26
+ {
27
+ boxes: true,
28
+ durationInSeconds: true,
29
+ fps: true,
30
+ dimensions: true,
31
+ videoCodec: true,
32
+ },
33
+ );
34
+ expect(result.durationInSeconds).toBe(634.571);
35
+ // TODO: Not yet implemented
36
+ expect(result.fps).toBe(null);
37
+ expect(result.dimensions).toEqual({
38
+ width: 1280,
39
+ height: 720,
40
+ });
41
+ expect(result.videoCodec).toEqual('vp9');
42
+ });
43
+
44
+ test('Should handle redirect', async () => {
45
+ const result = await parseMedia('https://remotion.dev/bbb.mp4', {
46
+ fps: true,
47
+ videoCodec: true,
48
+ durationInSeconds: true,
49
+ });
50
+ expect(result.videoCodec).toEqual('h264');
51
+ expect(result.fps).toEqual(24);
52
+ expect(result.durationInSeconds).toEqual(596.4733333333334);
12
53
  });
@@ -60,13 +60,60 @@ test('Should be able to parse a STSD audio box correctly', () => {
60
60
  numberOfChannels: 2,
61
61
  type: 'audio',
62
62
  sampleSize: 16,
63
- compressionId: 65534,
63
+ compressionId: -2,
64
64
  packetSize: 0,
65
- samplesPerPacket: 0,
66
- bitsPerSample: 1,
67
- bytesPerFrame: 0,
68
- bytesPerPacket: 1024,
65
+ samplesPerPacket: 1024,
66
+ bitsPerSample: 2,
67
+ bytesPerFrame: 2,
68
+ bytesPerPacket: 1,
69
69
  sampleRate: 44100,
70
+ children: [
71
+ {
72
+ boxSize: 91,
73
+ boxType: 'wave',
74
+ children: [
75
+ {
76
+ boxSize: 12,
77
+ boxType: 'frma',
78
+ children: [],
79
+ offset: 76,
80
+ type: 'regular-box',
81
+ },
82
+ {
83
+ boxSize: 12,
84
+ boxType: 'mp4a',
85
+ children: [],
86
+ offset: 88,
87
+ type: 'regular-box',
88
+ },
89
+ {
90
+ descriptors: [
91
+ {
92
+ objectTypeIndication: 'aac',
93
+ type: 'decoder-config-descriptor',
94
+ },
95
+ {
96
+ type: 'sl-config-descriptor',
97
+ },
98
+ ],
99
+ esId: 0,
100
+ sizeOfInstance: 34,
101
+ tag: 3,
102
+ type: 'esds-box',
103
+ version: 0,
104
+ },
105
+ {
106
+ boxSize: 8,
107
+ boxType: '\u0000\u0000\u0000\u0000',
108
+ children: [],
109
+ offset: 151,
110
+ type: 'regular-box',
111
+ },
112
+ ],
113
+ offset: 68,
114
+ type: 'regular-box',
115
+ },
116
+ ],
70
117
  },
71
118
  ],
72
119
  });