Adds converter modules and sorters
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good

Converters are now the result of combining multiple modules, and running them in the selected sequence. I hope to be able to completely remove converters by replacing them with templates that simply run some modules in a sequence, before running FFmpeg. Then I want to be able to parse a command into a template, so users have full control of what a template does.

Sorters each sort a list of streams after a single criteria. They can be chained in order to create complex chained sorters.
This commit is contained in:
2024-04-12 15:31:34 +02:00
parent 376d5655f2
commit 461c7552b3
51 changed files with 1819 additions and 579 deletions

View File

@ -2,15 +2,23 @@ package net.knarcraft.ffmpegconverter.converter;
import net.knarcraft.ffmpegconverter.container.FFMpegCommand;
import net.knarcraft.ffmpegconverter.container.StreamProbeResult;
import net.knarcraft.ffmpegconverter.streams.AudioStream;
import net.knarcraft.ffmpegconverter.streams.StreamObject;
import net.knarcraft.ffmpegconverter.converter.module.ConverterModule;
import net.knarcraft.ffmpegconverter.converter.module.DebugModule;
import net.knarcraft.ffmpegconverter.converter.module.ModuleExecutor;
import net.knarcraft.ffmpegconverter.converter.module.mapping.BurnSubtitleModule;
import net.knarcraft.ffmpegconverter.converter.module.mapping.NthAudioStreamModule;
import net.knarcraft.ffmpegconverter.converter.module.mapping.SelectSingleStreamModule;
import net.knarcraft.ffmpegconverter.converter.module.output.SetOutputFileModule;
import net.knarcraft.ffmpegconverter.streams.SubtitleStream;
import net.knarcraft.ffmpegconverter.streams.VideoStream;
import net.knarcraft.ffmpegconverter.utility.FFMpegHelper;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import static net.knarcraft.ffmpegconverter.utility.FFMpegHelper.getNthSteam;
/**
* A simple converter for web-video
*/
@ -38,27 +46,31 @@ public class WebVideoConverter extends AbstractConverter {
public String[] generateConversionCommand(@NotNull String executable, @NotNull StreamProbeResult probeResult,
@NotNull String outFile) {
FFMpegCommand command = FFMpegHelper.getFFMpegWebVideoCommand(executable, probeResult.parsedFiles());
List<StreamObject> streams = probeResult.parsedStreams();
List<ConverterModule> modules = new ArrayList<>();
if (this.debug) {
FFMpegHelper.addDebugArguments(command, 50, 120);
modules.add(new DebugModule(0, 0));
}
//Get first streams from the file
SubtitleStream subtitleStream = getNthSubtitleStream(streams, 0);
VideoStream videoStream = getNthVideoStream(streams, 0);
AudioStream audioStream = getNthAudioSteam(streams, 0);
SubtitleStream subtitleStream = getNthSteam(probeResult.getSubtitleStreams(), 0);
VideoStream videoStream = getNthSteam(probeResult.getVideoStreams(), 0);
if (videoStream == null) {
throw new IllegalArgumentException("The selected video stream does not exist.");
}
//Add streams to output
FFMpegHelper.addSubtitleAndVideoStream(command, subtitleStream, videoStream);
if (audioStream != null) {
FFMpegHelper.addAudioStream(command, audioStream, true);
if (subtitleStream != null) {
modules.add(new BurnSubtitleModule(subtitleStream, videoStream, true));
} else {
modules.add(new SelectSingleStreamModule(videoStream));
}
modules.add(new NthAudioStreamModule(probeResult.getAudioStreams(), 0));
command.setOutputFile(outFile);
modules.add(new SetOutputFileModule(outFile));
new ModuleExecutor(command, modules).execute();
return command.getResult();
}
}