Adds converter for stripping embedded captions from hevc
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good
This commit is contained in:
parent
986b5c3bcf
commit
60830654f7
@ -7,6 +7,7 @@ import net.knarcraft.ffmpegconverter.converter.AudioExtractor;
|
|||||||
import net.knarcraft.ffmpegconverter.converter.AudioToVorbisConverter;
|
import net.knarcraft.ffmpegconverter.converter.AudioToVorbisConverter;
|
||||||
import net.knarcraft.ffmpegconverter.converter.Converter;
|
import net.knarcraft.ffmpegconverter.converter.Converter;
|
||||||
import net.knarcraft.ffmpegconverter.converter.DownScaleConverter;
|
import net.knarcraft.ffmpegconverter.converter.DownScaleConverter;
|
||||||
|
import net.knarcraft.ffmpegconverter.converter.EmbeddedCaptionStripper;
|
||||||
import net.knarcraft.ffmpegconverter.converter.LetterboxCropper;
|
import net.knarcraft.ffmpegconverter.converter.LetterboxCropper;
|
||||||
import net.knarcraft.ffmpegconverter.converter.MKVToMP4Transcoder;
|
import net.knarcraft.ffmpegconverter.converter.MKVToMP4Transcoder;
|
||||||
import net.knarcraft.ffmpegconverter.converter.MkvH264Converter;
|
import net.knarcraft.ffmpegconverter.converter.MkvH264Converter;
|
||||||
@ -102,7 +103,8 @@ public class FFMpegConvert {
|
|||||||
11. Stream reorder
|
11. Stream reorder
|
||||||
12. Letterbox cropper
|
12. Letterbox cropper
|
||||||
13. Video's Audio to vorbis converter
|
13. Video's Audio to vorbis converter
|
||||||
14. Audio from video extractor""", 1, 14, Integer.MIN_VALUE);
|
14. Audio from video extractor
|
||||||
|
15. Embedded caption stripper""", 1, 15, Integer.MIN_VALUE);
|
||||||
|
|
||||||
return switch (choice) {
|
return switch (choice) {
|
||||||
case 1 -> generateWebAnimeConverter();
|
case 1 -> generateWebAnimeConverter();
|
||||||
@ -120,6 +122,7 @@ public class FFMpegConvert {
|
|||||||
case 13 -> new AudioToVorbisConverter(FFPROBE_PATH, FFMPEG_PATH);
|
case 13 -> new AudioToVorbisConverter(FFPROBE_PATH, FFMPEG_PATH);
|
||||||
case 14 -> new AudioExtractor(FFPROBE_PATH, FFMPEG_PATH, getChoice("<output audio extension>",
|
case 14 -> new AudioExtractor(FFPROBE_PATH, FFMPEG_PATH, getChoice("<output audio extension>",
|
||||||
"mp3"), getChoice("<stream to extract>", 0, 1000, 0));
|
"mp3"), getChoice("<stream to extract>", 0, 1000, 0));
|
||||||
|
case 15 -> new EmbeddedCaptionStripper(FFPROBE_PATH, FFMPEG_PATH);
|
||||||
default -> null;
|
default -> null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
package net.knarcraft.ffmpegconverter.converter;
|
||||||
|
|
||||||
|
import net.knarcraft.ffmpegconverter.container.FFMpegCommand;
|
||||||
|
import net.knarcraft.ffmpegconverter.container.StreamProbeResult;
|
||||||
|
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.MapAllModule;
|
||||||
|
import net.knarcraft.ffmpegconverter.converter.module.output.CopyAllModule;
|
||||||
|
import net.knarcraft.ffmpegconverter.converter.module.output.SetOutputFileModule;
|
||||||
|
import net.knarcraft.ffmpegconverter.utility.FFMpegHelper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A transcoder which removes embedded caption subtitles, like EIA-608
|
||||||
|
*/
|
||||||
|
public class EmbeddedCaptionStripper extends AbstractConverter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new mkv to mp4 transcoder
|
||||||
|
*
|
||||||
|
* @param ffprobePath <p>Path/command to ffprobe.</p>
|
||||||
|
* @param ffmpegPath <p>Path/command to ffmpeg.</p>
|
||||||
|
*/
|
||||||
|
public EmbeddedCaptionStripper(String ffprobePath, String ffmpegPath) {
|
||||||
|
super("mkv");
|
||||||
|
this.ffprobePath = ffprobePath;
|
||||||
|
this.ffmpegPath = ffmpegPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public List<String> getValidFormats() {
|
||||||
|
return List.of("mkv");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nullable
|
||||||
|
public FFMpegCommand generateConversionCommand(@NotNull String executable, @NotNull StreamProbeResult probeResult,
|
||||||
|
@NotNull String outFile) {
|
||||||
|
FFMpegCommand command = FFMpegHelper.getFFMpegGeneralFileCommand(executable, probeResult.parsedFiles());
|
||||||
|
List<ConverterModule> modules = new ArrayList<>();
|
||||||
|
|
||||||
|
if (this.debug) {
|
||||||
|
modules.add(new DebugModule());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy stream info
|
||||||
|
modules.add(new CopyAllModule());
|
||||||
|
|
||||||
|
//Add streams to output file
|
||||||
|
modules.add(new MapAllModule<>(probeResult.getVideoStreams()));
|
||||||
|
modules.add(new MapAllModule<>(probeResult.getAudioStreams()));
|
||||||
|
modules.add(new MapAllModule<>(probeResult.getSubtitleStreams()));
|
||||||
|
modules.add(new MapAllModule<>(probeResult.getOtherStreams()));
|
||||||
|
command.addOutputFileOption("-bsf:v", "filter_units=remove_types=39");
|
||||||
|
|
||||||
|
modules.add(new SetOutputFileModule(outFile));
|
||||||
|
|
||||||
|
new ModuleExecutor(command, modules).execute();
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user