interface HLSFromTSTranscodeOptions extends BaseTranscodeOptions {
type: 'hls-from-ts'
+ isAAC: boolean
+
hlsPlaylist: {
videoFilename: string
}
const input = rtmpUrl
const command = getFFmpeg(input, 'live')
- command.inputOption('-fflags nobuffer')
const varStreamMap: string[] = []
])
command.outputOption('-preset superfast')
+ command.outputOption('-sc_threshold 0')
addDefaultEncoderGlobalParams({ command })
function getLiveMuxingCommand (rtmpUrl: string, outPath: string) {
const command = getFFmpeg(rtmpUrl, 'live')
- command.inputOption('-fflags nobuffer')
command.outputOption('-c:v copy')
command.outputOption('-c:a copy')
function addDefaultLiveHLSParams (command: ffmpeg.FfmpegCommand, outPath: string) {
command.outputOption('-hls_time ' + VIDEO_LIVE.SEGMENT_TIME_SECONDS)
command.outputOption('-hls_list_size ' + VIDEO_LIVE.SEGMENTS_LIST_SIZE)
- command.outputOption('-hls_flags delete_segments')
+ command.outputOption('-hls_flags delete_segments+independent_segments')
command.outputOption(`-hls_segment_filename ${join(outPath, '%v-%06d.ts')}`)
command.outputOption('-master_pl_name master.m3u8')
command.outputOption(`-f hls`)
async function buildHLSVODFromTSCommand (command: ffmpeg.FfmpegCommand, options: HLSFromTSTranscodeOptions) {
const videoPath = getHLSVideoPath(options)
- 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')
+ if (options.isAAC) {
+ // Required for example when copying an AAC stream from an MPEG-TS
+ // Since it's a bitstream filter, we don't need to reencode the audio
+ command.outputOption('-bsf:a aac_adtstoasc')
+ }
addCommonHLSVODCommandOptions(command, videoPath)