]>
Commit | Line | Data |
---|---|---|
0c9668f7 C |
1 | import { FfprobeData } from 'fluent-ffmpeg' |
2 | import { getAudioStream, getVideoStream } from '@shared/ffmpeg' | |
3 | import { logger } from '../logger' | |
4 | import { forceNumber } from '@shared/core-utils' | |
5 | ||
6 | export async function getVideoStreamCodec (path: string) { | |
7 | const videoStream = await getVideoStream(path) | |
8 | if (!videoStream) return '' | |
9 | ||
10 | const videoCodec = videoStream.codec_tag_string | |
11 | ||
12 | if (videoCodec === 'vp09') return 'vp09.00.50.08' | |
13 | if (videoCodec === 'hev1') return 'hev1.1.6.L93.B0' | |
14 | ||
15 | const baseProfileMatrix = { | |
16 | avc1: { | |
17 | High: '6400', | |
18 | Main: '4D40', | |
19 | Baseline: '42E0' | |
20 | }, | |
21 | av01: { | |
22 | High: '1', | |
23 | Main: '0', | |
24 | Professional: '2' | |
25 | } | |
26 | } | |
27 | ||
28 | let baseProfile = baseProfileMatrix[videoCodec][videoStream.profile] | |
29 | if (!baseProfile) { | |
30 | logger.warn('Cannot get video profile codec of %s.', path, { videoStream }) | |
31 | baseProfile = baseProfileMatrix[videoCodec]['High'] // Fallback | |
32 | } | |
33 | ||
34 | if (videoCodec === 'av01') { | |
35 | let level = videoStream.level.toString() | |
36 | if (level.length === 1) level = `0${level}` | |
37 | ||
38 | // Guess the tier indicator and bit depth | |
39 | return `${videoCodec}.${baseProfile}.${level}M.08` | |
40 | } | |
41 | ||
42 | let level = forceNumber(videoStream.level).toString(16) | |
43 | if (level.length === 1) level = `0${level}` | |
44 | ||
45 | // Default, h264 codec | |
46 | return `${videoCodec}.${baseProfile}${level}` | |
47 | } | |
48 | ||
49 | export async function getAudioStreamCodec (path: string, existingProbe?: FfprobeData) { | |
50 | const { audioStream } = await getAudioStream(path, existingProbe) | |
51 | ||
52 | if (!audioStream) return '' | |
53 | ||
54 | const audioCodecName = audioStream.codec_name | |
55 | ||
56 | if (audioCodecName === 'opus') return 'opus' | |
57 | if (audioCodecName === 'vorbis') return 'vorbis' | |
58 | if (audioCodecName === 'aac') return 'mp4a.40.2' | |
59 | if (audioCodecName === 'mp3') return 'mp4a.40.34' | |
60 | ||
61 | logger.warn('Cannot get audio codec of %s.', path, { audioStream }) | |
62 | ||
63 | return 'mp4a.40.2' // Fallback | |
64 | } |