diff options
author | Chocobozzz <me@florianbigard.com> | 2023-02-14 13:55:21 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2023-02-14 14:06:34 +0100 |
commit | 20321f2049f46a7bfaadcc5da2f1eb53b9bb4d76 (patch) | |
tree | aa58dd778335149ee64e3971dec190c1bb337229 /server/helpers/ffmpeg | |
parent | 98bd5e2256bfdeba6d5ab07f0421acfde1a0de26 (diff) | |
download | PeerTube-20321f2049f46a7bfaadcc5da2f1eb53b9bb4d76.tar.gz PeerTube-20321f2049f46a7bfaadcc5da2f1eb53b9bb4d76.tar.zst PeerTube-20321f2049f46a7bfaadcc5da2f1eb53b9bb4d76.zip |
Reencode the video on cut
Unfortunately copying audio/video is not precise enough and could lead
to inconsistencies
Diffstat (limited to 'server/helpers/ffmpeg')
-rw-r--r-- | server/helpers/ffmpeg/ffmpeg-edition.ts | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/server/helpers/ffmpeg/ffmpeg-edition.ts b/server/helpers/ffmpeg/ffmpeg-edition.ts index 78de8f3b3..02c5ea8de 100644 --- a/server/helpers/ffmpeg/ffmpeg-edition.ts +++ b/server/helpers/ffmpeg/ffmpeg-edition.ts | |||
@@ -3,7 +3,7 @@ import { VIDEO_FILTERS } from '@server/initializers/constants' | |||
3 | import { AvailableEncoders } from '@shared/models' | 3 | import { AvailableEncoders } from '@shared/models' |
4 | import { logger, loggerTagsFactory } from '../logger' | 4 | import { logger, loggerTagsFactory } from '../logger' |
5 | import { getFFmpeg, runCommand } from './ffmpeg-commons' | 5 | import { getFFmpeg, runCommand } from './ffmpeg-commons' |
6 | import { presetCopy, presetVOD } from './ffmpeg-presets' | 6 | import { presetVOD } from './ffmpeg-presets' |
7 | import { ffprobePromise, getVideoStreamDimensionsInfo, getVideoStreamDuration, getVideoStreamFPS, hasAudioStream } from './ffprobe-utils' | 7 | import { ffprobePromise, getVideoStreamDimensionsInfo, getVideoStreamDuration, getVideoStreamFPS, hasAudioStream } from './ffprobe-utils' |
8 | 8 | ||
9 | const lTags = loggerTagsFactory('ffmpeg') | 9 | const lTags = loggerTagsFactory('ffmpeg') |
@@ -13,25 +13,38 @@ async function cutVideo (options: { | |||
13 | outputPath: string | 13 | outputPath: string |
14 | start?: number | 14 | start?: number |
15 | end?: number | 15 | end?: number |
16 | |||
17 | availableEncoders: AvailableEncoders | ||
18 | profile: string | ||
16 | }) { | 19 | }) { |
17 | const { inputPath, outputPath } = options | 20 | const { inputPath, outputPath, availableEncoders, profile } = options |
18 | 21 | ||
19 | logger.debug('Will cut the video.', { options, ...lTags() }) | 22 | logger.debug('Will cut the video.', { options, ...lTags() }) |
20 | 23 | ||
24 | const mainProbe = await ffprobePromise(inputPath) | ||
25 | const fps = await getVideoStreamFPS(inputPath, mainProbe) | ||
26 | const { resolution } = await getVideoStreamDimensionsInfo(inputPath, mainProbe) | ||
27 | |||
21 | let command = getFFmpeg(inputPath, 'vod') | 28 | let command = getFFmpeg(inputPath, 'vod') |
22 | .output(outputPath) | 29 | .output(outputPath) |
23 | 30 | ||
24 | command = presetCopy(command) | 31 | command = await presetVOD({ |
32 | command, | ||
33 | input: inputPath, | ||
34 | availableEncoders, | ||
35 | profile, | ||
36 | resolution, | ||
37 | fps, | ||
38 | canCopyAudio: false, | ||
39 | canCopyVideo: false | ||
40 | }) | ||
25 | 41 | ||
26 | if (options.start) { | 42 | if (options.start) { |
27 | // Using -ss as output option is more precise than using it as input option | ||
28 | command.outputOption('-ss ' + options.start) | 43 | command.outputOption('-ss ' + options.start) |
29 | } | 44 | } |
30 | 45 | ||
31 | if (options.end) { | 46 | if (options.end) { |
32 | const endSeeking = options.end - (options.start || 0) | 47 | command.outputOption('-to ' + options.end) |
33 | |||
34 | command.outputOption('-to ' + endSeeking) | ||
35 | } | 48 | } |
36 | 49 | ||
37 | await runCommand({ command }) | 50 | await runCommand({ command }) |