utils.ts
⎇
Raw
1import { AudioCodec, MediaContainer, VideoCodec } from "./types";
2
3export function decodePath(path: string) {
4 return path
5 .split("/")
6 .map((segment) => decodeURIComponent(segment))
7 .join("/");
8}
9
10export function encodePath(path: string) {
11 return path
12 .split("/")
13 .map((segment) => encodeURIComponent(segment))
14 .join("/");
15}
16
17//IMPORTANT: needs to be kept in sync with the backend ffmpeg parameters
18export function createRFC6381String(container: MediaContainer, videoCodec: VideoCodec, audioCodec: AudioCodec): string {
19 let mimeType = "";
20 switch (container) {
21 case MediaContainer.mp4:
22 mimeType = "video/mp4";
23 break;
24 case MediaContainer.webm:
25 mimeType = "video/webm";
26 break;
27 case MediaContainer.mp3:
28 mimeType = "audio/mpeg";
29 break;
30 case MediaContainer.ogg:
31 mimeType = "audio/ogg";
32 break;
33 default:
34 throw new Error(`Unsupported container: ${container}`);
35 }
36 mimeType += '; codecs="';
37
38 //TODO: use correct level values
39 switch (videoCodec) {
40 case VideoCodec.none:
41 break;
42 case VideoCodec.av1:
43 mimeType += "av01.0.17M.08, "; // Main profile, level 6.1, Main tier, 8bit
44 break;
45 case VideoCodec.h264:
46 mimeType += "avc1.64003d, "; // High Profile (profile number + constraint flags), level 6.1
47 break;
48 case VideoCodec.h265:
49 mimeType += "hev1.1.1.L183, "; // Main profile, Main tier, level 6.1
50 break;
51 case VideoCodec.vp9:
52 mimeType += "vp09.00.61.08, "; //4:2:0, level 6.1, 8bit
53 break;
54 default:
55 throw new Error(`Unsupported video codec: ${videoCodec}`);
56 }
57
58 switch (audioCodec) {
59 case AudioCodec.opus:
60 mimeType += "opus";
61 break;
62 case AudioCodec.aac:
63 mimeType += "aac";
64 break;
65 case AudioCodec.vorbis:
66 mimeType += "vorbis";
67 break;
68 case AudioCodec.mp3:
69 mimeType += "mp3";
70 break;
71 default:
72 throw new Error(`Unsupported audio codec: ${audioCodec}`);
73 }
74 mimeType += '"';
75 return mimeType;
76}
77