export class FFmpegTranscodingWrapper extends AbstractTranscodingWrapper {
private ffmpegCommand: FfmpegCommand
+
+ private aborted = false
+ private errored = false
private ended = false
async run () {
this.ffmpegCommand = CONFIG.LIVE.TRANSCODING.ENABLED
? await this.buildFFmpegLive().getLiveTranscodingCommand({
- inputUrl: this.inputUrl,
+ inputUrl: this.inputLocalUrl,
outPath: this.outDirectory,
masterPlaylistName: this.streamingPlaylist.playlistFilename,
hasAudio: this.hasAudio
})
: this.buildFFmpegLive().getLiveMuxingCommand({
- inputUrl: this.inputUrl,
+ inputUrl: this.inputLocalUrl,
outPath: this.outDirectory,
masterPlaylistName: this.streamingPlaylist.playlistFilename,
logger.info('Running local live muxing/transcoding for %s.', this.videoUUID, this.lTags())
- this.ffmpegCommand.run()
-
let ffmpegShellCommand: string
this.ffmpegCommand.on('start', cmdline => {
ffmpegShellCommand = cmdline
}
abort () {
- // Nothing to do, ffmpeg will automatically exit
+ if (this.ended || this.errored || this.aborted) return
+
+ logger.debug('Killing ffmpeg after live abort of ' + this.videoUUID, this.lTags())
+
+ this.ffmpegCommand.kill('SIGINT')
+
+ this.aborted = true
+ this.emit('end')
}
private onFFmpegError (options: {
// Don't care that we killed the ffmpeg process
if (err?.message?.includes('Exiting normally')) return
+ if (this.ended || this.errored || this.aborted) return
logger.error('FFmpeg transcoding error.', { err, stdout, stderr, ffmpegShellCommand, ...this.lTags() })
+ this.errored = true
this.emit('error', { err })
}
private onFFmpegEnded () {
- if (this.ended) return
+ if (this.ended || this.errored || this.aborted) return
+
+ logger.debug('Live ffmpeg transcoding ended for ' + this.videoUUID, this.lTags())
this.ended = true
this.emit('end')