Adds converter modules and sorters
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good
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:
@ -2,13 +2,21 @@ 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.converter.module.ConverterModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.DebugModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.ModuleExecutor;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.hardwarecoding.H264HardwareEncodingModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.hardwarecoding.H26XDecodeModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.mapping.MapAllModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.output.CopyAudioModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.output.CopySubtitlesModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.output.FastStartModule;
|
||||
import net.knarcraft.ffmpegconverter.converter.module.output.SetOutputFileModule;
|
||||
import net.knarcraft.ffmpegconverter.streams.StreamObject;
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -37,46 +45,44 @@ public class MkvH264Converter extends AbstractConverter {
|
||||
public String[] generateConversionCommand(@NotNull String executable, @NotNull StreamProbeResult probeResult,
|
||||
@NotNull String outFile) {
|
||||
FFMpegCommand command = FFMpegHelper.getFFMpegGeneralFileCommand(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));
|
||||
}
|
||||
|
||||
// Map video if present
|
||||
List<StreamObject> videoStreams = filterStreamsByType(streams, VideoStream.class);
|
||||
List<StreamObject> videoStreams = new ArrayList<>(probeResult.getVideoStreams());
|
||||
if (!videoStreams.isEmpty()) {
|
||||
for (StreamObject streamObject : videoStreams) {
|
||||
if (!streamObject.getCodecName().equals("h264") && !streamObject.getCodecName().equals("h266")) {
|
||||
if (!streamObject.getCodecName().equals("h264") && !streamObject.getCodecName().equals("h265")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
FFMpegHelper.addH26xHardwareDecoding(command);
|
||||
modules.add(new H26XDecodeModule());
|
||||
break;
|
||||
}
|
||||
|
||||
FFMpegHelper.mapAllStreams(command, videoStreams);
|
||||
FFMpegHelper.addH264HardwareEncoding(command, 17);
|
||||
command.addOutputFileOption("-movflags", "+faststart");
|
||||
modules.add(new MapAllModule<>(videoStreams));
|
||||
modules.add(new H264HardwareEncodingModule(17));
|
||||
modules.add(new FastStartModule());
|
||||
}
|
||||
|
||||
// Map audio if present
|
||||
List<StreamObject> audioStreams = filterStreamsByType(streams, AudioStream.class);
|
||||
if (!audioStreams.isEmpty()) {
|
||||
FFMpegHelper.mapAllStreams(command, audioStreams);
|
||||
command.addOutputFileOption("-c:a", "copy");
|
||||
if (!probeResult.getAudioStreams().isEmpty()) {
|
||||
modules.add(new MapAllModule<>(probeResult.getAudioStreams()));
|
||||
modules.add(new CopyAudioModule());
|
||||
}
|
||||
|
||||
// Map subtitles if present
|
||||
List<StreamObject> subtitleStreams = filterStreamsByType(streams, SubtitleStream.class);
|
||||
List<StreamObject> subtitleStreams = new ArrayList<>(probeResult.getSubtitleStreams());
|
||||
if (!subtitleStreams.isEmpty()) {
|
||||
FFMpegHelper.mapAllStreams(command, subtitleStreams);
|
||||
command.addOutputFileOption("-c:s", "copy");
|
||||
modules.add(new MapAllModule<>(probeResult.getSubtitleStreams()));
|
||||
modules.add(new CopySubtitlesModule());
|
||||
}
|
||||
|
||||
command.addOutputFileOption("-f", "matroska");
|
||||
|
||||
command.setOutputFile(outFile);
|
||||
modules.add(new SetOutputFileModule(outFile));
|
||||
new ModuleExecutor(command, modules).execute();
|
||||
return command.getResult();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user