Fixed aspect ratio of WEBM files
[meviz.git] / src / main / java / eu / svjatoslav / meviz / encoder / converters / AvconvVideo.java
index beb634e..2492b52 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Meviz - Various tools collection to work with multimedia.
- * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * Copyright (C) 2012 -- 2017, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public License
 
 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.List;
 
-import eu.svjatoslav.meviz.encoder.BitrateParameter;
-import eu.svjatoslav.meviz.encoder.BitrateParameter.bitrate;
-import eu.svjatoslav.meviz.encoder.EncodingOptions;
-
 public class AvconvVideo extends AbstractConverter {
 
-       private String constructCodecParamsString(final EncodingOptions options,
-                       final int videoBitrate, final int audioBitrate,
-                       final String videoCodec, final String audioCodec) {
+    private String constructCodecParamsString(final EncodingOptions options,
+                                              final int videoBitrate, final int audioBitrate,
+                                              final String videoCodec, final String audioCodec) {
+
+        final StringBuilder codecParams = new StringBuilder();
+
+        if (audioCodec == null)
+            codecParams.append("-an ");
+        else
+            codecParams.append("-acodec " + audioCodec + " ");
+
+        codecParams.append("-vcodec " + videoCodec + " ");
+
+        if (videoBitrate != -1)
+            codecParams.append("-b " + videoBitrate + "k ");
+
+        if (audioBitrate != -1)
+            codecParams.append("-b:a " + audioBitrate + "k ");
 
-               StringBuffer codecParams = new StringBuffer();
+        if (options.isDeinterlace())
+            codecParams.append("-filter:v yadif ");
 
-               if (audioCodec == null)
-                       codecParams.append("-an ");
-               else
-                       codecParams.append("-acodec " + audioCodec + " ");
+        if (options.getTargetFps() != null)
+            codecParams.append("-r " + options.getTargetFps() + " ");
 
-               codecParams.append("-vcodec " + videoCodec + " ");
+        return codecParams.toString();
+    }
 
-               if (videoBitrate != -1)
-                       codecParams.append("-b " + videoBitrate + "k ");
+    private int getAudioBitrateValue(final Bitrate bitRate) {
+        switch (bitRate) {
+            case LOW:
+                return 128;
 
-               if (audioBitrate != -1)
-                       codecParams.append("-b:a " + audioBitrate + "k ");
+            case MEDIUM:
+                return 160;
 
-               if (options.deinterlace)
-                       codecParams.append("-filter:v yadif ");
+            case HIGH:
+                return 320;
 
-               return codecParams.toString();
-       }
+            case COPY:
+                return -1;
 
-       private int getAudioBitrateValue(final BitrateParameter.bitrate bitRate) {
-               switch (bitRate) {
-               case LOW:
-                       return 128;
+            case NONE:
+                return -1;
 
-               case MEDIUM:
-                       return 160;
+            default:
+                throw new RuntimeException("Audio bitrate: " + bitRate
+                        + " is not supported.");
+        }
+    }
 
-               case HIGH:
-                       return 320;
+    @Override
+    public String getCommand(final File inputFile, final File targetFile,
+                             final EncodingOptions options, final String targetFormat) {
 
-               case COPY:
-                       return -1;
+        int videoBitrate = getVideoBitrateValue(options.getVideoBitrate());
+        int audioBitrate = getAudioBitrateValue(options.getAudioBitrate());
 
-               case NONE:
-                       return -1;
+        // convert
+        final StringBuilder codecParams = new StringBuilder();
 
-               default:
-                       throw new RuntimeException("Audio bitrate: " + bitRate
-                                       + " is not supported.");
-               }
-       }
+        String videoCodec = "libx264";
+        String audioCodec = "libmp3lame";
 
-       @Override
-       public String getCommand(final File inputFile, final File targetFile,
-                       final EncodingOptions options, String targetFormat) {
+        if (targetFormat.equals("webm")) {
+            videoCodec = "vp8";
+            audioCodec = "opus";
+            codecParams.append("-s 800x450 ");
+        }
 
-               int videoBitrate = getVideoBitrateValue(options.getVideoBitrate());
-               int audioBitrate = getAudioBitrateValue(options.getAudioBitrate());
+        if (options.getVideoBitrate() == Bitrate.COPY)
+            videoCodec = "copy";
 
-               // convert
-               final StringBuffer codecParams = new StringBuffer();
+        if (options.getAudioBitrate() == Bitrate.COPY)
+            audioCodec = "copy";
 
-               String videoCodec = "libx264";
-               String audioCodec = "libmp3lame";
+        if (options.getAudioBitrate() == Bitrate.NONE)
+            audioCodec = null;
 
-               if (targetFormat.equals("webm")) {
-                       videoCodec = "vp9";
-                       audioCodec = "opus";
-                       codecParams.append("-s 800x600 ");
-               }
+        if (options.isForPortablePlayer()) {
+            videoBitrate = 1000;
+            audioBitrate = 128;
+            videoCodec = "libxvid";
 
-               if (options.getVideoBitrate() == bitrate.COPY)
-                       videoCodec = "copy";
+            // reduce resolution
+            codecParams.append("-s 640x480 ");
 
-               if (options.getAudioBitrate() == bitrate.COPY)
-                       audioCodec = "copy";
+            // enforce maximum keyframe interval
+            codecParams.append("-g 150 ");
+        }
 
-               if (options.getAudioBitrate() == bitrate.NONE)
-                       audioCodec = null;
+        codecParams.append(constructCodecParamsString(options, videoBitrate,
+                audioBitrate, videoCodec, audioCodec));
 
-               if (options.forPortablePlayer) {
-                       videoBitrate = 1000;
-                       audioBitrate = 128;
-                       videoCodec = "libxvid";
-                       codecParams.append("-s 640x480 ");
-               }
+        return "avconv -i \"" + inputFile.getAbsolutePath() + "\" "
+                + codecParams.toString() + "\"" + targetFile.getAbsolutePath()
+                + "\"";
+    }
 
-               codecParams.append(constructCodecParamsString(options, videoBitrate,
-                               audioBitrate, videoCodec, audioCodec));
+    @Override
+    public List<String> getSourceFileExtensions() {
+        return getSupportedExtensions();
+    }
 
-               return "avconv -i \"" + inputFile.getAbsolutePath() + "\" "
-                               + codecParams.toString() + "\"" + targetFile.getAbsolutePath()
-                               + "\"";
-       }
+    private List<String> getSupportedExtensions() {
+        return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v",
+                "webm", "mov", "asf");
+    }
 
-       @Override
-       public List<String> getSourceFileExtensions() {
-               return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v",
-                               "webm");
-       }
+    @Override
+    public List<String> getTargetFileExtensions() {
+        return getSupportedExtensions();
+    }
 
-       @Override
-       public List<String> getTargetFileExtensions() {
-               return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v",
-                               "webm");
-       }
+    private int getVideoBitrateValue(final Bitrate bitRate) {
+        switch (bitRate) {
+            case LOW:
+                return 1000;
 
-       private int getVideoBitrateValue(final BitrateParameter.bitrate bitRate) {
-               switch (bitRate) {
-               case LOW:
-                       return 1000;
+            case MEDIUM:
+                return 4000;
 
-               case MEDIUM:
-                       return 4000;
+            case HIGH:
+                return 16000;
 
-               case HIGH:
-                       return 40000;
+            case COPY:
+                return -1;
 
-               case COPY:
-                       return -1;
+            default:
+                throw new RuntimeException("Video bitrate: " + bitRate
+                        + " is not supported.");
+        }
+    }
 
-               default:
-                       throw new RuntimeException("Video bitrate: " + bitRate
-                                       + " is not supported.");
-               }
-       }
-
-       @Override
-       public boolean isTerminalMandatory() {
-               return true;
-       }
+    @Override
+    public boolean isTerminalMandatory() {
+        return true;
+    }
 
 }