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.Converter;
import net.knarcraft.ffmpegconverter.converter.DownScaleConverter;
import net.knarcraft.ffmpegconverter.converter.EmbeddedCaptionStripper;
import net.knarcraft.ffmpegconverter.converter.LetterboxCropper;
import net.knarcraft.ffmpegconverter.converter.MKVToMP4Transcoder;
import net.knarcraft.ffmpegconverter.converter.MkvH264Converter;
@ -102,7 +103,8 @@ public class FFMpegConvert {
11. Stream reorder
12. Letterbox cropper
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) {
case 1 -> generateWebAnimeConverter();
@ -120,6 +122,7 @@ public class FFMpegConvert {
case 13 -> new AudioToVorbisConverter(FFPROBE_PATH, FFMPEG_PATH);
case 14 -> new AudioExtractor(FFPROBE_PATH, FFMPEG_PATH, getChoice("<output audio extension>",
"mp3"), getChoice("<stream to extract>", 0, 1000, 0));
case 15 -> new EmbeddedCaptionStripper(FFPROBE_PATH, FFMPEG_PATH);
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;
}
}