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

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

package com.spikeify.ffmpeg.builder;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.spikeify.ffmpeg.probe.FFmpegProbeResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Builds a ffmpeg command line
 *
 * @author bramp
 */
public class FFmpegBuilder {

	final static Logger LOG = LoggerFactory.getLogger(FFmpegBuilder.class);

	public enum Strict {
		VERY,        // strictly conform to a older more strict version of the spec or reference software
		STRICT,      // strictly conform to all the things in the spec no matter what consequences
		NORMAL,
		UNOFFICAL,   // allow unofficial extensions
		EXPERIMENTAL;

		//ffmpeg command line requires these options in the lower case
		public String toString() {
			return name().toLowerCase();
		}
	}

	// Global Settings
	public boolean override = true;
	public int pass = 0;
	public String pass_prefix;

	// Input settings
	public Long startOffset; // in millis
	public String input;
	public FFmpegProbeResult inputProbe;

	// Output
	public List outputs = new ArrayList();

	public FFmpegBuilder overrideOutputFiles(boolean override) {
		this.override = override;
		return this;
	}

	public boolean getOverrideOutputFiles() {
		return this.override;
	}

	public FFmpegBuilder setPass(int pass) {
		this.pass = pass;
		return this;
	}

	public FFmpegBuilder setPassPrefix(String prefix) {
		this.pass_prefix = prefix;
		return this;
	}

	public FFmpegBuilder setInput(String filename) {
		this.input = filename;
		return this;
	}

	public FFmpegBuilder setInput(FFmpegProbeResult result) {
		this.inputProbe = checkNotNull(result);
		this.input = checkNotNull(result.format).filename;

		return this;
	}

	public FFmpegBuilder setStartOffset(long duration, TimeUnit units) {
		checkNotNull(duration);
		checkNotNull(units);

		this.startOffset = units.toMillis(duration);

		return this;
	}

	/**
	 * Create new output file
	 *
	 * @param filename
	 * @return A new FFmpegOutputBuilder
	 */
	public FFmpegOutputBuilder addOutput(String filename) {
		FFmpegOutputBuilder output = new FFmpegOutputBuilder(this, filename);
		outputs.add(output);
		return output;
	}

	/**
	 * Create new output (to stdout)
	 */
	public FFmpegOutputBuilder addStreamedOutput() {
		return addOutput("-");
	}

	public List build() {
		ImmutableList.Builder args = new ImmutableList.Builder();

		Preconditions.checkArgument(input != null, "Input must be specified");
		Preconditions.checkArgument(!outputs.isEmpty(), "At least one output must be specified");

		args.add(override ? "-y" : "-n");
		args.add("-v", "error"); // TODO make configurable

		if (startOffset != null) {
			args.add("-ss").add(String.format("%.3f", startOffset / 1000f));
		}

		args.add("-i").add(input);

		if (pass > 0) {
			args.add("-pass").add(Integer.toString(pass));

			if (pass_prefix != null) {
				args.add("-passlogfile").add(pass_prefix);
			}
		}

		for (FFmpegOutputBuilder output : this.outputs) {
			args.addAll(output.build(pass));
		}

		return args.build();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy