buildSegment static method
RenderPlan
buildSegment({
- required VideoEditorClip clip,
- required ClipTransition transitionIn,
- required ClipTransition transitionOut,
- required Size canvas,
- required String outputPath,
- required List<
String> videoCodecArgs, - 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()),
);
}