Change how we handle resolution
It was an enum before, now we just use video height
This commit is contained in:
parent
aa8b6df4a5
commit
14d3270f36
18 changed files with 266 additions and 230 deletions
79
server/helpers/ffmpeg-utils.ts
Normal file
79
server/helpers/ffmpeg-utils.ts
Normal file
|
@ -0,0 +1,79 @@
|
|||
import * as Promise from 'bluebird'
|
||||
import * as ffmpeg from 'fluent-ffmpeg'
|
||||
|
||||
import { CONFIG } from '../initializers'
|
||||
import { VideoResolution } from '../../shared/models/videos/video-resolution.enum'
|
||||
|
||||
function getVideoFileHeight (path: string) {
|
||||
return new Promise<number>((res, rej) => {
|
||||
ffmpeg.ffprobe(path, (err, metadata) => {
|
||||
if (err) return rej(err)
|
||||
|
||||
const videoStream = metadata.streams.find(s => s.codec_type === 'video')
|
||||
return res(videoStream.height)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getDurationFromVideoFile (path: string) {
|
||||
return new Promise<number>((res, rej) => {
|
||||
ffmpeg.ffprobe(path, (err, metadata) => {
|
||||
if (err) return rej(err)
|
||||
|
||||
return res(Math.floor(metadata.format.duration))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function generateImageFromVideoFile (fromPath: string, folder: string, imageName: string, size?: string) {
|
||||
const options = {
|
||||
filename: imageName,
|
||||
count: 1,
|
||||
folder
|
||||
}
|
||||
|
||||
if (size !== undefined) {
|
||||
options['size'] = size
|
||||
}
|
||||
|
||||
return new Promise<string>((res, rej) => {
|
||||
ffmpeg(fromPath)
|
||||
.on('error', rej)
|
||||
.on('end', () => res(imageName))
|
||||
.thumbnail(options)
|
||||
})
|
||||
}
|
||||
|
||||
type TranscodeOptions = {
|
||||
inputPath: string
|
||||
outputPath: string
|
||||
resolution?: VideoResolution
|
||||
}
|
||||
|
||||
function transcode (options: TranscodeOptions) {
|
||||
return new Promise<void>((res, rej) => {
|
||||
let command = ffmpeg(options.inputPath)
|
||||
.output(options.outputPath)
|
||||
.videoCodec('libx264')
|
||||
.outputOption('-threads ' + CONFIG.TRANSCODING.THREADS)
|
||||
.outputOption('-movflags faststart')
|
||||
|
||||
if (options.resolution !== undefined) {
|
||||
const size = `${options.resolution}x?` // '720x?' for example
|
||||
command = command.size(size)
|
||||
}
|
||||
|
||||
command.on('error', rej)
|
||||
.on('end', res)
|
||||
.run()
|
||||
})
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
getVideoFileHeight,
|
||||
getDurationFromVideoFile,
|
||||
generateImageFromVideoFile,
|
||||
transcode
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue