1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-03 09:49:20 +02:00

Fix live replay audio/video desync

This commit is contained in:
Chocobozzz 2025-02-27 09:29:53 +01:00
parent a6a3f00be4
commit 0390864755
No known key found for this signature in database
GPG key ID: 583A612D890159BE

View file

@ -60,7 +60,7 @@ export interface MergeAudioTranscodeOptions extends BaseTranscodeVODOptions {
} }
export type TranscodeVODOptions = export type TranscodeVODOptions =
HLSTranscodeOptions | HLSTranscodeOptions
| HLSFromTSTranscodeOptions | HLSFromTSTranscodeOptions
| VideoTranscodeOptions | VideoTranscodeOptions
| MergeAudioTranscodeOptions | MergeAudioTranscodeOptions
@ -79,7 +79,7 @@ export class FFmpegVOD {
async transcode (options: TranscodeVODOptions) { async transcode (options: TranscodeVODOptions) {
const builders: { const builders: {
[ type in TranscodeVODOptionsType ]: (options: TranscodeVODOptions) => Promise<void> | void [type in TranscodeVODOptionsType]: (options: TranscodeVODOptions) => Promise<void> | void
} = { } = {
'quick-transcode': this.buildQuickTranscodeCommand.bind(this), 'quick-transcode': this.buildQuickTranscodeCommand.bind(this),
'hls': this.buildHLSVODCommand.bind(this), 'hls': this.buildHLSVODCommand.bind(this),
@ -108,11 +108,13 @@ export class FFmpegVOD {
return this.ended return this.ended
} }
private async buildVODCommand (options: TranscodeVODOptions & { private async buildVODCommand (
videoStreamOnly?: boolean options: TranscodeVODOptions & {
canCopyAudio?: boolean videoStreamOnly?: boolean
canCopyVideo?: boolean canCopyAudio?: boolean
}) { canCopyVideo?: boolean
}
) {
const { const {
resolution, resolution,
fps, fps,
@ -227,6 +229,7 @@ export class FFmpegVOD {
const videoPath = this.getHLSVideoPath(options) const videoPath = this.getHLSVideoPath(options)
command.outputOption('-c copy') command.outputOption('-c copy')
command.outputOption('-copyts')
if (options.isAAC) { if (options.isAAC) {
// Required for example when copying an AAC stream from an MPEG-TS // Required for example when copying an AAC stream from an MPEG-TS
@ -239,12 +242,12 @@ export class FFmpegVOD {
private addCommonHLSVODCommandOptions (command: FfmpegCommand, outputPath: string) { private addCommonHLSVODCommandOptions (command: FfmpegCommand, outputPath: string) {
return command.outputOption('-hls_time 4') return command.outputOption('-hls_time 4')
.outputOption('-hls_list_size 0') .outputOption('-hls_list_size 0')
.outputOption('-hls_playlist_type vod') .outputOption('-hls_playlist_type vod')
.outputOption('-hls_segment_filename ' + outputPath) .outputOption('-hls_segment_filename ' + outputPath)
.outputOption('-hls_segment_type fmp4') .outputOption('-hls_segment_type fmp4')
.outputOption('-f hls') .outputOption('-f hls')
.outputOption('-hls_flags single_file') .outputOption('-hls_flags single_file')
} }
private async fixHLSPlaylistIfNeeded (options: TranscodeVODOptions) { private async fixHLSPlaylistIfNeeded (options: TranscodeVODOptions) {
@ -257,7 +260,7 @@ export class FFmpegVOD {
// Fix wrong mapping with some ffmpeg versions // Fix wrong mapping with some ffmpeg versions
const newContent = fileContent.toString() const newContent = fileContent.toString()
.replace(`#EXT-X-MAP:URI="${videoFilePath}",`, `#EXT-X-MAP:URI="${videoFileName}",`) .replace(`#EXT-X-MAP:URI="${videoFilePath}",`, `#EXT-X-MAP:URI="${videoFileName}",`)
await writeFile(options.outputPath, newContent) await writeFile(options.outputPath, newContent)
} }