Adds converter for stripping embedded captions from hevc
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good

This commit is contained in:
Kristian Knarvik 2025-05-03 19:25:07 +02:00
parent 986b5c3bcf
commit 60830654f7
2 changed files with 72 additions and 1 deletions

View File

@ -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;
}; };
} }

View File

@ -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;
}
}