Make it possible to extract audio from video master
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 5 Oct 2025 22:16:31 +0000 (01:16 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 5 Oct 2025 22:16:31 +0000 (01:16 +0300)
src/main/java/eu/svjatoslav/meviz/encoder/converters/FFMpegAudio.java

index e3f2cbc..396f173 100755 (executable)
@@ -6,38 +6,97 @@
 
 package eu.svjatoslav.meviz.encoder.converters;
 
+import eu.svjatoslav.meviz.encoder.BitrateParameter.Bitrate;
 import eu.svjatoslav.meviz.encoder.EncodingOptions;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-
 public class FFMpegAudio extends AbstractConverter {
-
-    private static final String[] SUPPORTED_FORMATS = new String[]{"ogg", "wav", "mp3", "m4a", "flac"};
-
+    private static final String[] SUPPORTED_AUDIO_FORMATS = new String[]{"ogg", "wav", "mp3", "m4a", "flac"};
+    private static final String[] SUPPORTED_VIDEO_FORMATS = new String[]{"mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v", "webm", "mov", "asf", "3gp"};
     @Override
     public String getCommand(final File inputFile, final File targetFile,
                              final EncodingOptions options, String targetFormat) {
-
-        final String codecParams = "-b:a 192k";
-
+        int audioBitrate = getAudioBitrateValue(options.getAudioBitrate());
+        String audioCodec = getDefaultAudioCodec(targetFormat);
+        if (options.getAudioBitrate() == Bitrate.COPY) {
+            audioCodec = "copy";
+        } else if (options.getAudioBitrate() == Bitrate.LOSSLESS && isLosslessFormat(targetFormat)) {
+            audioCodec = getLosslessAudioCodec(targetFormat);
+        } else if (options.getAudioBitrate() == Bitrate.NONE) {
+            return ""; // No audio output, but error for audio converter
+        }
+        StringBuilder codecParams = new StringBuilder("-vn ");
+        if (audioCodec != null) {
+            codecParams.append("-acodec ").append(audioCodec).append(" ");
+        }
+        if (audioBitrate != -1 && !isLosslessFormat(targetFormat)) {
+            codecParams.append("-b:a ").append(audioBitrate).append("k ");
+        }
         return "ffmpeg -i \"" + inputFile.getAbsolutePath() + "\" "
-                + codecParams + " \"" + targetFile.getAbsolutePath() + "\"";
+                + codecParams.toString() + "\"" + targetFile.getAbsolutePath() + "\"";
+    }
+    private String getDefaultAudioCodec(String targetFormat) {
+        switch (targetFormat) {
+            case "ogg":
+                return "libvorbis";
+            case "mp3":
+                return "libmp3lame";
+            case "m4a":
+                return "aac";
+            case "wav":
+                return "pcm_s16le";
+            case "flac":
+                return "flac";
+            default:
+                return null;
+        }
+    }
+    private String getLosslessAudioCodec(String targetFormat) {
+        if (targetFormat.equals("flac")) {
+            return "flac";
+        } else if (targetFormat.equals("wav")) {
+            return "pcm_s16le";
+        }
+        return null;
+    }
+    private boolean isLosslessFormat(String format) {
+        return format.equals("wav") || format.equals("flac");
+    }
+    private int getAudioBitrateValue(final Bitrate bitRate) {
+        switch (bitRate) {
+            case LOW:
+                return 128;
+            case MEDIUM:
+                return 160;
+            case HIGH:
+                return 320;
+            case COPY:
+                return -1;
+            case NONE:
+                return -1;
+            case LOSSLESS:
+                return -1;
+            default:
+                throw new RuntimeException("Audio bitrate: " + bitRate
+                        + " is not supported.");
+        }
     }
-
     @Override
     public List<String> getSourceFileExtensions() {
-        return toList(SUPPORTED_FORMATS);
+        List<String> list = new ArrayList<>();
+        Collections.addAll(list, SUPPORTED_AUDIO_FORMATS);
+        Collections.addAll(list, SUPPORTED_VIDEO_FORMATS);
+        return list;
     }
-
     @Override
     public List<String> getTargetFileExtensions() {
-        return toList(SUPPORTED_FORMATS);
+        return toList(SUPPORTED_AUDIO_FORMATS);
     }
-
     @Override
     public boolean isTerminalMandatory() {
         return false;
     }
-
-}
+}
\ No newline at end of file