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:
		@@ -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;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user