]>
Commit | Line | Data |
---|---|---|
0c9668f7 C |
1 | import { FfmpegCommand } from 'fluent-ffmpeg' |
2 | import { EncoderOptions } from '@shared/models' | |
3 | import { buildStreamSuffix } from '../ffmpeg-utils' | |
4 | ||
5 | export function addDefaultEncoderGlobalParams (command: FfmpegCommand) { | |
6 | // avoid issues when transcoding some files: https://trac.ffmpeg.org/ticket/6375 | |
7 | command.outputOption('-max_muxing_queue_size 1024') | |
8 | // strip all metadata | |
9 | .outputOption('-map_metadata -1') | |
10 | // allows import of source material with incompatible pixel formats (e.g. MJPEG video) | |
11 | .outputOption('-pix_fmt yuv420p') | |
12 | } | |
13 | ||
14 | export function addDefaultEncoderParams (options: { | |
15 | command: FfmpegCommand | |
16 | encoder: 'libx264' | string | |
17 | fps: number | |
18 | ||
19 | streamNum?: number | |
20 | }) { | |
21 | const { command, encoder, fps, streamNum } = options | |
22 | ||
23 | if (encoder === 'libx264') { | |
24 | // 3.1 is the minimal resource allocation for our highest supported resolution | |
25 | command.outputOption(buildStreamSuffix('-level:v', streamNum) + ' 3.1') | |
26 | ||
27 | if (fps) { | |
28 | // Keyframe interval of 2 seconds for faster seeking and resolution switching. | |
29 | // https://streaminglearningcenter.com/blogs/whats-the-right-keyframe-interval.html | |
30 | // https://superuser.com/a/908325 | |
31 | command.outputOption(buildStreamSuffix('-g:v', streamNum) + ' ' + (fps * 2)) | |
32 | } | |
33 | } | |
34 | } | |
35 | ||
36 | export function applyEncoderOptions (command: FfmpegCommand, options: EncoderOptions) { | |
37 | command.inputOptions(options.inputOptions ?? []) | |
38 | .outputOptions(options.outputOptions ?? []) | |
39 | } |