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