import path from 'path'; import { getTranscodeConfig } from './config'; import { probeHardwareEncoder } from './hw-probe'; import { PROFILES, TranscodeProfileName } from './profiles'; function bitrateToNumber(bitrate: string): number { return Number.parseInt(bitrate.replace(/k$/i, ''), 10); } export function buildRemuxArgs(inputPath: string, outDir: string, startTime: number): string[] { const config = getTranscodeConfig(); return [ '-hide_banner', '-loglevel', 'error', '-nostats', ...(startTime > 0 ? ['-ss', startTime.toString()] : []), '-i', inputPath, '-map', '0:v:0', '-map', '0:a:0?', '-c:v', 'copy', '-bsf:v', 'h264_mp4toannexb', '-c:a', 'copy', '-f', 'hls', '-hls_time', config.segmentDuration.toString(), '-hls_list_size', '0', '-hls_segment_type', 'mpegts', '-hls_flags', 'independent_segments+temp_file', '-hls_segment_filename', path.join(outDir, 'seg_%05d.ts'), '-start_number', '0', path.join(outDir, 'index.m3u8'), ]; } export function buildTranscodeArgs(inputPath: string, outDir: string, profileName: Exclude, startTime: number): string[] { const config = getTranscodeConfig(); const profile = PROFILES[profileName]; const encoder = probeHardwareEncoder(); const bitrate = bitrateToNumber(profile.vBitrate); return [ '-hide_banner', '-loglevel', 'error', '-nostats', ...(startTime > 0 ? ['-ss', startTime.toString()] : []), '-i', inputPath, '-map', '0:v:0', '-map', '0:a:0?', '-c:v', encoder.codec, ...encoder.presetArgs, '-profile:v', 'main', '-level', '4.1', '-pix_fmt', 'yuv420p', '-vf', `scale=-2:min(${profile.maxHeight}\\,ih):flags=lanczos`, '-b:v', profile.vBitrate, '-maxrate', profile.vBitrate, '-bufsize', `${bitrate * 2}k`, '-force_key_frames', `expr:gte(t,n_forced*${config.segmentDuration})`, '-c:a', profile.aCodec, '-b:a', profile.aBitrate, '-ac', '2', '-f', 'hls', '-hls_time', config.segmentDuration.toString(), '-hls_list_size', '0', '-hls_segment_type', 'mpegts', '-hls_flags', 'independent_segments+temp_file', '-hls_segment_filename', path.join(outDir, 'seg_%05d.ts'), '-start_number', '0', path.join(outDir, 'index.m3u8'), ]; }