From 3bace3b970fc7724b032b4f542a2944b747416db Mon Sep 17 00:00:00 2001 From: Svjatoslav Agejenko Date: Mon, 6 Oct 2025 01:16:31 +0300 Subject: [PATCH] Make it possible to extract audio from video --- .../meviz/encoder/converters/FFMpegAudio.java | 89 +++++++++++++++---- 1 file changed, 74 insertions(+), 15 deletions(-) diff --git a/src/main/java/eu/svjatoslav/meviz/encoder/converters/FFMpegAudio.java b/src/main/java/eu/svjatoslav/meviz/encoder/converters/FFMpegAudio.java index e3f2cbc..396f173 100755 --- a/src/main/java/eu/svjatoslav/meviz/encoder/converters/FFMpegAudio.java +++ b/src/main/java/eu/svjatoslav/meviz/encoder/converters/FFMpegAudio.java @@ -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 getSourceFileExtensions() { - return toList(SUPPORTED_FORMATS); + List list = new ArrayList<>(); + Collections.addAll(list, SUPPORTED_AUDIO_FORMATS); + Collections.addAll(list, SUPPORTED_VIDEO_FORMATS); + return list; } - @Override public List getTargetFileExtensions() { - return toList(SUPPORTED_FORMATS); + return toList(SUPPORTED_AUDIO_FORMATS); } - @Override public boolean isTerminalMandatory() { return false; } - -} +} \ No newline at end of file -- 2.20.1