X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fmeviz%2Fencoder%2Fconverters%2FAvconvVideo.java;h=4ea5380f8ddea0cc44e09b757194120f4a0b1fad;hb=cf6e4ace4972f24f40f88ea12fcf99c763e4e40a;hp=ea08e5d903528e50520cc20b58499b818a1e3a29;hpb=0679806fed21137dc0d10f1ef99dc1bba73ddb95;p=meviz.git diff --git a/src/main/java/eu/svjatoslav/meviz/encoder/converters/AvconvVideo.java b/src/main/java/eu/svjatoslav/meviz/encoder/converters/AvconvVideo.java index ea08e5d..4ea5380 100644 --- a/src/main/java/eu/svjatoslav/meviz/encoder/converters/AvconvVideo.java +++ b/src/main/java/eu/svjatoslav/meviz/encoder/converters/AvconvVideo.java @@ -1,6 +1,6 @@ /* * Meviz - Various tools collection to work with multimedia. - * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * Copyright (C) 2012 -- 2018, 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 @@ -9,140 +9,151 @@ 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 "); - StringBuffer codecParams = new StringBuffer(); + if (audioBitrate != -1) + codecParams.append("-b:a " + audioBitrate + "k "); - if (audioCodec == null) - codecParams.append("-an "); - else - codecParams.append("-acodec " + audioCodec + " "); + if (options.isDeinterlace()) + codecParams.append("-filter:v yadif "); - codecParams.append("-vcodec " + videoCodec + " "); + if (options.getTargetFps() != null) + codecParams.append("-r " + options.getTargetFps() + " "); - if (videoBitrate != -1) - codecParams.append("-b " + videoBitrate + "k "); + return codecParams.toString(); + } - if (audioBitrate != -1) - codecParams.append("-b:a " + audioBitrate + "k "); + private int getAudioBitrateValue(final Bitrate bitRate) { + switch (bitRate) { + case LOW: + return 128; - if (options.deinterlace) - codecParams.append("-filter:v yadif "); + case MEDIUM: + return 160; - return codecParams.toString(); - } + case HIGH: + return 320; - private int getAudioBitrateValue(final BitrateParameter.bitrate bitRate) { - switch (bitRate) { - case LOW: - return 128; + case COPY: + return -1; - case MEDIUM: - return 160; + case NONE: + return -1; - case HIGH: - return 320; + default: + throw new RuntimeException("Audio bitrate: " + bitRate + + " is not supported."); + } + } - case COPY: - return -1; + @Override + public String getCommand(final File inputFile, final File targetFile, + final EncodingOptions options, final String targetFormat) { - case NONE: - return -1; + int videoBitrate = getVideoBitrateValue(options.getVideoBitrate()); + int audioBitrate = getAudioBitrateValue(options.getAudioBitrate()); - default: - throw new RuntimeException("Audio bitrate: " + bitRate - + " is not supported."); - } - } + // convert + final StringBuilder codecParams = new StringBuilder(); - @Override - public String getCommand(final File inputFile, final File targetFile, - final EncodingOptions options, String targetFormat) { + String videoCodec = "libx264"; + String audioCodec = "libmp3lame"; - int videoBitrate = getVideoBitrateValue(options.getVideoBitrate()); - int audioBitrate = getAudioBitrateValue(options.getAudioBitrate()); + if (targetFormat.equals("webm")) { + videoCodec = "vp8"; + audioCodec = "opus"; + codecParams.append("-s 800x450 "); + } - // convert - final StringBuffer codecParams = new StringBuffer(); + if (options.getVideoBitrate() == Bitrate.COPY) + videoCodec = "copy"; - String videoCodec = "libx264"; - String audioCodec = "libmp3lame"; + if (options.getAudioBitrate() == Bitrate.COPY) + audioCodec = "copy"; - if (targetFormat.equals("webm")) { - videoCodec = "vp9"; - audioCodec = "opus"; - } + if (options.getAudioBitrate() == Bitrate.NONE) + audioCodec = null; - if (options.getVideoBitrate() == bitrate.COPY) - videoCodec = "copy"; + if (options.isForPortablePlayer()) { + videoBitrate = 1000; + audioBitrate = 128; + videoCodec = "libxvid"; - if (options.getAudioBitrate() == bitrate.COPY) - audioCodec = "copy"; + // reduce resolution + codecParams.append("-s 640x480 "); - if (options.getAudioBitrate() == bitrate.NONE) - audioCodec = null; + // enforce maximum keyframe interval + codecParams.append("-g 150 "); + } - if (options.forPortablePlayer) { - videoBitrate = 1000; - audioBitrate = 128; - videoCodec = "libxvid"; - codecParams.append("-s 640x480 "); - } + codecParams.append(constructCodecParamsString(options, videoBitrate, + audioBitrate, videoCodec, audioCodec)); - codecParams.append(constructCodecParamsString(options, videoBitrate, - audioBitrate, videoCodec, audioCodec)); + return "avconv -i \"" + inputFile.getAbsolutePath() + "\" " + + codecParams.toString() + "\"" + targetFile.getAbsolutePath() + + "\""; + } - return "avconv -i \"" + inputFile.getAbsolutePath() + "\" " - + codecParams.toString() + "\"" + targetFile.getAbsolutePath() - + "\""; - } + @Override + public List getSourceFileExtensions() { + return getSupportedExtensions(); + } - @Override - public List getSourceFileExtensions() { - return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v", - "webm"); - } + private List getSupportedExtensions() { + return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v", + "webm", "mov", "asf", "3gp"); + } - @Override - public List getTargetFileExtensions() { - return toList("mkv", "mts", "mp4", "avi", "mpg", "mpeg", "vob", "m4v", - "webm"); - } + @Override + public List getTargetFileExtensions() { + return getSupportedExtensions(); + } - private int getVideoBitrateValue(final BitrateParameter.bitrate bitRate) { - switch (bitRate) { - case LOW: - return 1000; + private int getVideoBitrateValue(final Bitrate bitRate) { + switch (bitRate) { + case LOW: + return 1000; - case MEDIUM: - return 4000; + case MEDIUM: + return 4000; - case HIGH: - return 40000; + case HIGH: + return 16000; - 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; + } }