]>
Commit | Line | Data |
---|---|---|
0c9668f7 C |
1 | import { pick } from '@shared/core-utils' |
2 | import { FFmpegCommandWrapper } from '../ffmpeg-command-wrapper' | |
3 | import { ffprobePromise, getVideoStreamBitrate, getVideoStreamDimensionsInfo, hasAudioStream } from '../ffprobe' | |
4 | import { addDefaultEncoderGlobalParams, addDefaultEncoderParams, applyEncoderOptions } from './encoder-options' | |
5 | import { getScaleFilter, StreamType } from '../ffmpeg-utils' | |
6 | ||
7 | export async function presetVOD (options: { | |
8 | commandWrapper: FFmpegCommandWrapper | |
9 | ||
10 | input: string | |
11 | ||
12 | canCopyAudio: boolean | |
13 | canCopyVideo: boolean | |
14 | ||
15 | resolution: number | |
16 | fps: number | |
17 | ||
18 | scaleFilterValue?: string | |
19 | }) { | |
20 | const { commandWrapper, input, resolution, fps, scaleFilterValue } = options | |
21 | const command = commandWrapper.getCommand() | |
22 | ||
23 | command.format('mp4') | |
24 | .outputOption('-movflags faststart') | |
25 | ||
26 | addDefaultEncoderGlobalParams(command) | |
27 | ||
28 | const probe = await ffprobePromise(input) | |
29 | ||
30 | // Audio encoder | |
31 | const bitrate = await getVideoStreamBitrate(input, probe) | |
32 | const videoStreamDimensions = await getVideoStreamDimensionsInfo(input, probe) | |
33 | ||
34 | let streamsToProcess: StreamType[] = [ 'audio', 'video' ] | |
35 | ||
36 | if (!await hasAudioStream(input, probe)) { | |
37 | command.noAudio() | |
38 | streamsToProcess = [ 'video' ] | |
39 | } | |
40 | ||
41 | for (const streamType of streamsToProcess) { | |
42 | const builderResult = await commandWrapper.getEncoderBuilderResult({ | |
43 | ...pick(options, [ 'canCopyAudio', 'canCopyVideo' ]), | |
44 | ||
45 | input, | |
46 | inputBitrate: bitrate, | |
47 | inputRatio: videoStreamDimensions?.ratio || 0, | |
48 | ||
49 | resolution, | |
50 | fps, | |
51 | streamType, | |
52 | ||
53 | videoType: 'vod' as 'vod' | |
54 | }) | |
55 | ||
56 | if (!builderResult) { | |
57 | throw new Error('No available encoder found for stream ' + streamType) | |
58 | } | |
59 | ||
60 | commandWrapper.debugLog( | |
61 | `Apply ffmpeg params from ${builderResult.encoder} for ${streamType} ` + | |
62 | `stream of input ${input} using ${commandWrapper.getProfile()} profile.`, | |
63 | { builderResult, resolution, fps } | |
64 | ) | |
65 | ||
66 | if (streamType === 'video') { | |
67 | command.videoCodec(builderResult.encoder) | |
68 | ||
69 | if (scaleFilterValue) { | |
70 | command.outputOption(`-vf ${getScaleFilter(builderResult.result)}=${scaleFilterValue}`) | |
71 | } | |
72 | } else if (streamType === 'audio') { | |
73 | command.audioCodec(builderResult.encoder) | |
74 | } | |
75 | ||
76 | applyEncoderOptions(command, builderResult.result) | |
77 | addDefaultEncoderParams({ command, encoder: builderResult.encoder, fps }) | |
78 | } | |
79 | } | |
80 | ||
81 | export function presetCopy (commandWrapper: FFmpegCommandWrapper) { | |
82 | commandWrapper.getCommand() | |
83 | .format('mp4') | |
84 | .videoCodec('copy') | |
85 | .audioCodec('copy') | |
86 | } | |
87 | ||
88 | export function presetOnlyAudio (commandWrapper: FFmpegCommandWrapper) { | |
89 | commandWrapper.getCommand() | |
90 | .format('mp4') | |
91 | .audioCodec('copy') | |
92 | .noVideo() | |
93 | } |