From 3bc68dfd6183078fb56b53e24e74f889c85c4ae0 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 6 Nov 2020 09:09:36 +0100 Subject: Fix audio sync after saving replay hls.js seems to not correctly handle audio gaps with fragmented mp4 (but can with a ts playlist) --- server/helpers/ffmpeg-utils.ts | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'server/helpers/ffmpeg-utils.ts') diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 3b794b8a2..7a54b4642 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -1,5 +1,5 @@ import * as ffmpeg from 'fluent-ffmpeg' -import { readFile, remove, writeFile } from 'fs-extra' +import { outputFile, readFile, remove, writeFile } from 'fs-extra' import { dirname, join } from 'path' import { VideoFileMetadata } from '@shared/models/videos/video-file-metadata' import { getMaxBitrate, getTargetBitrate, VideoResolution } from '../../shared/models/videos' @@ -423,8 +423,14 @@ function runLiveMuxing (rtmpUrl: string, outPath: string, deleteSegments: boolea } async function hlsPlaylistToFragmentedMP4 (hlsDirectory: string, segmentFiles: string[], outputPath: string) { - const concatFile = 'concat.txt' - const concatFilePath = join(hlsDirectory, concatFile) + const concatFilePath = join(hlsDirectory, 'concat.txt') + + function cleaner () { + remove(concatFilePath) + .catch(err => logger.error('Cannot remove concat file in %s.', hlsDirectory, { err })) + } + + // First concat the ts files to a mp4 file const content = segmentFiles.map(f => 'file ' + f) .join('\n') @@ -434,25 +440,25 @@ async function hlsPlaylistToFragmentedMP4 (hlsDirectory: string, segmentFiles: s command.inputOption('-safe 0') command.inputOption('-f concat') - command.outputOption('-c copy') + command.outputOption('-c:v copy') + command.audioFilter('aresample=async=1:first_pts=0') command.output(outputPath) - command.run() + return runCommand(command, cleaner) +} - function cleaner () { - remove(concatFilePath) - .catch(err => logger.error('Cannot remove concat file in %s.', hlsDirectory, { err })) - } +async function runCommand (command: ffmpeg.FfmpegCommand, onEnd?: Function) { + command.run() return new Promise((res, rej) => { command.on('error', err => { - cleaner() + if (onEnd) onEnd() rej(err) }) command.on('end', () => { - cleaner() + if (onEnd) onEnd() res() }) @@ -501,7 +507,7 @@ function addDefaultLiveHLSParams (command: ffmpeg.FfmpegCommand, outPath: string command.outputOption('-hls_flags delete_segments') } - command.outputOption(`-hls_segment_filename ${join(outPath, '%v-%d.ts')}`) + command.outputOption(`-hls_segment_filename ${join(outPath, '%v-%04d.ts')}`) command.outputOption('-master_pl_name master.m3u8') command.outputOption(`-f hls`) -- cgit v1.2.3