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 void constructCodecParamsString(final EncodingOptions options,
+ private String constructCodecParamsString(final EncodingOptions options,
final int videoBitrate, final int audioBitrate,
- final StringBuffer codecParams, final String videoCodec,
- final String audioCodec) {
+ final String videoCodec, final String audioCodec) {
- codecParams.append("-acodec " + audioCodec + " -vcodec " + videoCodec
- + " ");
+ final StringBuffer codecParams = new StringBuffer();
+
+ 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 ");
- if (options.deinterlace)
+ if (options.isDeinterlace())
codecParams.append("-filter:v yadif ");
- }
- @Override
- public String getCommand(final File inputFile, final File targetFile,
- final EncodingOptions options) {
+ if (options.getTargetFps() != null)
+ codecParams.append("-r " + options.getTargetFps() + " ");
- int videoBitrate = -1;
- int audioBitrate = -1;
+ return codecParams.toString();
+ }
- switch (options.videoBitrate) {
+ private int getAudioBitrateValue(final BitrateParameter.bitrate bitRate) {
+ switch (bitRate) {
case LOW:
- videoBitrate = 1000;
- audioBitrate = 128;
- break;
+ return 128;
case MEDIUM:
- videoBitrate = 4000;
- audioBitrate = 192;
- break;
+ return 160;
case HIGH:
- videoBitrate = 40000;
- audioBitrate = 500;
- break;
+ return 320;
case COPY:
- break;
+ return -1;
+
+ case NONE:
+ return -1;
default:
- throw new RuntimeException("Video bitrate: " + options.videoBitrate
+ throw new RuntimeException("Audio bitrate: " + bitRate
+ " is not supported.");
}
+ }
+
+ @Override
+ public String getCommand(final File inputFile, final File targetFile,
+ final EncodingOptions options, final String targetFormat) {
+
+ int videoBitrate = getVideoBitrateValue(options.getVideoBitrate());
+ int audioBitrate = getAudioBitrateValue(options.getAudioBitrate());
// convert
final StringBuffer codecParams = new StringBuffer();
String videoCodec = "libx264";
String audioCodec = "libmp3lame";
- if (options.videoBitrate == bitrate.COPY) {
+ if (targetFormat.equals("webm")) {
+ videoCodec = "vp8";
+ audioCodec = "opus";
+ codecParams.append("-s 800x600 ");
+ }
+
+ if (options.getVideoBitrate() == bitrate.COPY)
videoCodec = "copy";
+
+ if (options.getAudioBitrate() == bitrate.COPY)
audioCodec = "copy";
- }
- if (options.forPortablePlayer) {
+ if (options.getAudioBitrate() == bitrate.NONE)
+ audioCodec = null;
+
+ if (options.isForPortablePlayer()) {
videoBitrate = 1000;
audioBitrate = 128;
videoCodec = "libxvid";
+
+ // reduce resolution
codecParams.append("-s 640x480 ");
+
+ // enforce maximum keyframe interval
+ codecParams.append("-g 150 ");
}
- constructCodecParamsString(options, videoBitrate, audioBitrate,
- codecParams, videoCodec, audioCodec);
+ codecParams.append(constructCodecParamsString(options, videoBitrate,
+ audioBitrate, videoCodec, audioCodec));
return "avconv -i \"" + inputFile.getAbsolutePath() + "\" "
- + codecParams.toString() + "\"" + targetFile.getAbsolutePath()
- + "\"";
+ + codecParams.toString() + "\"" + targetFile.getAbsolutePath()
+ + "\"";
}
@Override
public List<String> getSourceFileExtensions() {
- return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v");
+ return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v",
+ "webm");
}
@Override
public List<String> getTargetFileExtensions() {
- return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob");
+ return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v",
+ "webm");
+ }
+
+ private int getVideoBitrateValue(final BitrateParameter.bitrate bitRate) {
+ switch (bitRate) {
+ case LOW:
+ return 1000;
+
+ case MEDIUM:
+ return 4000;
+
+ case HIGH:
+ return 16000;
+
+ case COPY:
+ return -1;
+
+ default:
+ throw new RuntimeException("Video bitrate: " + bitRate
+ + " is not supported.");
+ }
}
@Override