buildSegment static method

RenderPlan buildSegment({
  1. required VideoEditorClip clip,
  2. required ClipTransition transitionIn,
  3. required ClipTransition transitionOut,
  4. required Size canvas,
  5. required String outputPath,
  6. required List<String> videoCodecArgs,
  7. int fps = 30,
})

Renders one clip, normalised exactly as in build, to a Matroska file with uncompressed audio. Preview segments are cached per clip and later joined with buildSegmentJoin without re-encoding the video; PCM audio avoids the AAC priming gaps that would otherwise build up at each join.

Implementation

static RenderPlan buildSegment({
  required VideoEditorClip clip,
  required ClipTransition transitionIn,
  required ClipTransition transitionOut,
  required Size canvas,
  required String outputPath,
  required List<String> videoCodecArgs,
  int fps = 30,
}) {
  final width = canvas.width.round();
  final height = canvas.height.round();
  final inputs = <String>[];
  final filters = <String>[];
  final seconds = _addClip(
    clip: clip,
    input: 0,
    label: '0',
    inputs: inputs,
    filters: filters,
    width: width,
    height: height,
    fps: fps,
    frames: segmentFrames(clip, fps),
    transitionIn: transitionIn,
    transitionOut: transitionOut,
  );
  return RenderPlan(
    arguments: [
      '-y',
      ...inputs,
      '-filter_complex', filters.join(';'),
      '-map', '[v0]',
      '-map', '[a0]',
      '-r', '$fps',
      ...videoCodecArgs,
      if (!videoCodecArgs.contains('-pix_fmt')) ...['-pix_fmt', 'yuv420p'],
      '-c:a', 'pcm_s16le',
      '-ar', '44100',
      '-t', _sec(seconds),
      '-f', 'matroska',
      outputPath,
    ],
    duration: Duration(milliseconds: (seconds * 1000).round()),
    canvas: Size(width.toDouble(), height.toDouble()),
  );
}