]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/live/shared/transcoding-wrapper/ffmpeg-transcoding-wrapper.ts
Don't run ffmpeg twice for lives
[github/Chocobozzz/PeerTube.git] / server / lib / live / shared / transcoding-wrapper / ffmpeg-transcoding-wrapper.ts
index 1f4c12bd4780ba0316a122ba173aa52405530c94..c6ee8ebf1cb057033c093ff1155a75ccef63f89a 100644 (file)
@@ -10,12 +10,15 @@ import { AbstractTranscodingWrapper } from './abstract-transcoding-wrapper'
 
 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,
@@ -31,7 +34,7 @@ export class FFmpegTranscodingWrapper extends AbstractTranscodingWrapper {
         hasAudio: this.hasAudio
       })
       : this.buildFFmpegLive().getLiveMuxingCommand({
-        inputUrl: this.inputUrl,
+        inputUrl: this.inputLocalUrl,
         outPath: this.outDirectory,
 
         masterPlaylistName: this.streamingPlaylist.playlistFilename,
@@ -42,8 +45,6 @@ export class FFmpegTranscodingWrapper extends AbstractTranscodingWrapper {
 
     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
@@ -63,7 +64,14 @@ export class FFmpegTranscodingWrapper extends AbstractTranscodingWrapper {
   }
 
   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: {
@@ -76,14 +84,18 @@ export class FFmpegTranscodingWrapper extends AbstractTranscodingWrapper {
 
     // 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')