Don't block video update on storyboard generation

pull/6527/head
Chocobozzz 2024-07-03 15:40:10 +02:00
parent e8ac84f1b3
commit 8ab6f23a00
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 14 additions and 10 deletions

View File

@ -6,6 +6,7 @@ import {
EncoderProfile,
SimpleLogger
} from '@peertube/peertube-models'
import { MutexInterface } from 'async-mutex'
import ffmpeg, { FfmpegCommand } from 'fluent-ffmpeg'
export interface FFmpegCommandWrapperOptions {
@ -82,7 +83,7 @@ export class FFmpegCommandWrapper {
this.command = undefined
}
buildCommand (input: string) {
buildCommand (input: string, inputFileMutexReleaser?: MutexInterface.Releaser) {
if (this.command) throw new Error('Command is already built')
// We set cwd explicitly because ffmpeg appears to create temporary files when trancoding which fails in read-only file systems
@ -96,6 +97,12 @@ export class FFmpegCommandWrapper {
this.command.outputOption('-threads ' + this.threads)
}
if (inputFileMutexReleaser) {
this.command.on('start', () => {
setTimeout(() => inputFileMutexReleaser(), 1000)
})
}
return this.command
}

View File

@ -1,3 +1,4 @@
import { MutexInterface } from 'async-mutex'
import { FfprobeData } from 'fluent-ffmpeg'
import { FFmpegCommandWrapper, FFmpegCommandWrapperOptions } from './ffmpeg-command-wrapper.js'
import { getVideoStreamDuration } from './ffprobe.js'
@ -100,6 +101,9 @@ export class FFmpegImage {
path: string
destination: string
// Will be released after the ffmpeg started
inputFileMutexReleaser: MutexInterface.Releaser
sprites: {
size: {
width: number

View File

@ -88,19 +88,11 @@ export class FFmpegVOD {
this.commandWrapper.debugLog('Will run transcode.', { options })
const command = this.commandWrapper.buildCommand(options.inputPath)
this.commandWrapper.buildCommand(options.inputPath, options.inputFileMutexReleaser)
.output(options.outputPath)
await builders[options.type](options)
command.on('start', () => {
setTimeout(() => {
if (options.inputFileMutexReleaser) {
options.inputFileMutexReleaser()
}
}, 1000)
})
await this.commandWrapper.runCommand()
await this.fixHLSPlaylistIfNeeded(options)

View File

@ -81,6 +81,7 @@ async function processGenerateStoryboard (job: Job): Promise<void> {
await ffmpeg.generateStoryboardFromVideo({
destination,
path: videoPath,
inputFileMutexReleaser,
sprites: {
size: {
height: spriteHeight,