All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.spikeify.ffmpeg.builder.StitcherBuilder Maven / Gradle / Ivy

package com.spikeify.ffmpeg.builder;

import com.google.common.collect.ImmutableList;
import com.spikeify.ffmpeg.builder.commands.BasicCommand;
import com.spikeify.ffmpeg.builder.commands.CaptionCommand;
import com.spikeify.ffmpeg.builder.commands.FadeInCommand;
import com.spikeify.ffmpeg.builder.commands.FadeOutCommand;
import com.spikeify.ffmpeg.builder.elements.VideoObject;

import java.util.List;

public class StitcherBuilder {

	private FFmpegBuilder parent;

	private List videoObjectBuilderList;

	protected StitcherBuilder(FFmpegBuilder parent, List videoObjectBuilderList) {
		this.videoObjectBuilderList = videoObjectBuilderList;
		this.parent = parent;
	}

	public FFmpegBuilder done() {
		ImmutableList.Builder args = new ImmutableList.Builder<>();

		String filterComplex = "";
		String videoOut = "vout";
		String audioOut = "aout";

		if (videoObjectBuilderList != null && videoObjectBuilderList.size() > 0) {
			//add inputs
			for (VideoObject videoObject : videoObjectBuilderList) {
				if (videoObject != null && videoObject.getPath() != null && videoObject.getPath().length() > 0) {
					args.add("-i", videoObject.getPath());
				}
			}

			//process video object
			int seqNum = 0;
			String concat = "";
			String closing = " ;\n";
			for (VideoObject videoObject : this.videoObjectBuilderList) {
				if (videoObject != null) {
					BasicCommand bcb = BasicCommand.set(videoObject, seqNum++);
					String basicOperation = bcb.getBasicCmd();

					String audioOperation = "";

					//set caption
					CaptionCommand captionCommand = CaptionCommand.set(videoObject.getCaptions(), videoObject.getCaption());
					basicOperation += captionCommand.getCmd();

					//set fade in
					FadeInCommand fadeInCommand = FadeInCommand.set(videoObject.getFadeIn());
					String videoFadeIn = fadeInCommand.getVideoCmd();
					String audioFadeIn = fadeInCommand.getAudioCmd();

					//set fade out
					FadeOutCommand fadeOutCommand = FadeOutCommand.set(videoObject.getFadeOut(), videoObject.getEnd());
					String videoFadeOut = fadeOutCommand.getVideoCmd();
					String audioFadeOut = fadeOutCommand.getAudioCmd();


					if (videoFadeIn.length() > 0 || videoFadeOut.length() > 0) {
						basicOperation += videoFadeIn + videoFadeOut;
					}
					if (audioFadeIn.length() > 0 || audioFadeOut.length() > 0) {
						audioOperation = bcb.getAudioStreamInput() + bcb.getAudioTrimCmd() + (bcb.getAudioTrimCmd().length() > 0 ? ", " : "") + audioFadeIn + (audioFadeOut.length() > 0 ? ", " : "") + audioFadeOut + bcb.getAudioStreamOutput();
					}

					//merge operations
					filterComplex += bcb.getVideoStreamInput() + basicOperation + bcb.getVideoStreamOutput() + closing;
					filterComplex += audioOperation.length() > 0 ? audioOperation + closing : "";
					concat += bcb.getVideoStreamOutput() + (audioOperation.length() > 0 ? bcb.getAudioStreamOutput() : bcb.getAudioStreamInput());
				}
			}

			concat += "concat=n=" + String.valueOf(seqNum) + ":v=1:a=1 [" + videoOut + "][" + audioOut + "]";
			filterComplex += concat;
		}


		args.add("-filter_complex", filterComplex);
		args.add("-map", "[" + videoOut + "]");
		args.add("-map", "[" + audioOut + "]");


		this.parent.sticherArgs = args;
		this.parent.isSticher = true;
		return this.parent;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy