import { readFile, remove, writeFile } from 'fs-extra'
import { dirname, join } from 'path'
import { FFMPEG_NICE, VIDEO_LIVE } from '@server/initializers/constants'
-import { AvailableEncoders, EncoderOptionsBuilder, EncoderOptions, EncoderProfile, VideoResolution } from '../../shared/models/videos'
+import { AvailableEncoders, EncoderOptions, EncoderOptionsBuilder, EncoderProfile, VideoResolution } from '../../shared/models/videos'
import { CONFIG } from '../initializers/config'
import { execPromise, promisify0 } from './core-utils'
import { computeFPS, getAudioStream, getVideoFileFPS } from './ffprobe-utils'
import { processImage } from './image-utils'
import { logger } from './logger'
-import { FilterSpecification } from 'fluent-ffmpeg'
/**
*
availableEncoders: AvailableEncoders
profile: string
- resolution: VideoResolution
+ resolution: number
isPortraitMode?: boolean
const varStreamMap: string[] = []
- const complexFilter: FilterSpecification[] = [
+ const complexFilter: ffmpeg.FilterSpecification[] = [
{
inputs: '[v:0]',
filter: 'split',
}
]
- command.outputOption('-preset superfast')
command.outputOption('-sc_threshold 0')
addDefaultEncoderGlobalParams({ command })
if (options.resolution !== undefined) {
scaleFilterValue = options.isPortraitMode === true
- ? `${options.resolution}:-2`
- : `-2:${options.resolution}`
+ ? `w=${options.resolution}:h=-2`
+ : `w=-2:h=${options.resolution}`
}
command = await presetVideo({ command, input: options.inputPath, transcodeOptions: options, fps, scaleFilterValue })
async function buildAudioMergeCommand (command: ffmpeg.FfmpegCommand, options: MergeAudioTranscodeOptions) {
command = command.loop(undefined)
- // Avoid "height not divisible by 2" error
- const scaleFilterValue = 'trunc(iw/2)*2:trunc(ih/2)*2'
+ const scaleFilterValue = getScaleCleanerValue()
command = await presetVideo({ command, input: options.audioPath, transcodeOptions: options, scaleFilterValue })
command.outputOption('-preset:v veryfast')
}
}
- const result = await builder({ input, resolution: resolution, fps, streamNum })
+ const result = await builder({ input, resolution, fps, streamNum })
return {
result,
return execPromise(`${ffmpegPath} -version`)
.then(stdout => {
- const parsed = stdout.match(/ffmpeg version .?(\d+\.\d+\.\d+)/)
+ const parsed = stdout.match(/ffmpeg version .?(\d+\.\d+(\.\d+)?)/)
if (!parsed || !parsed[1]) return rej(new Error(`Could not find ffmpeg version in ${stdout}`))
- return res(parsed[1])
+ // Fix ffmpeg version that does not include patch version (4.4 for example)
+ let version = parsed[1]
+ if (version.match(/^\d+\.\d+$/)) {
+ version += '.0'
+ }
+
+ return res(version)
})
.catch(err => rej(err))
})
})
}
+// Avoid "height not divisible by 2" error
+function getScaleCleanerValue () {
+ return 'trunc(iw/2)*2:trunc(ih/2)*2'
+}
+
// ---------------------------------------------------------------------------
export {