// ranges: ranges in seconds sS ffmpeg_makeSpliceFilter(L ranges) { new LS out; int i = 0; fOr (DoubleRange r : ranges) { int lbl = ++i; S start = ffmpeg_formatSeconds(r.start); S end = ffmpeg_formatSeconds(r.end); out.add("[0:v]trim=start=" + start + ":end=" + end + ",setpts=PTS-STARTPTS[v" + lbl + "]"); out.add("[0:a]atrim=start=" + start + ":end=" + end + ",asetpts=PTS-STARTPTS[a" + lbl + "]"); } S concat = "concat=n=" + l(ranges); out.add(joinMap(iota(i), j -> "[v" + j + "]") + concat + "[outv]"); out.add(joinMap(iota(i), j -> "[a" + j + "]") + + concat + ":v=0:a=1[outa]"); ret joinWithSemicolon(out); }