Java 使用音频文件进行转码时出现编码异常

Java 使用音频文件进行转码时出现编码异常,java,exception,audio,ffmpeg,encode,Java,Exception,Audio,Ffmpeg,Encode,我试图使用Eclipse4.50在MacOSX 10.11.3上调用的FFMPEG包装库进行代码转换 我的Converter.java类如下所示: package matador; import it.sauronsoftware.jave.AudioAttributes; import it.sauronsoftware.jave.EncodingAttributes; import it.sauronsoftware.jave.EncoderException; import it.sau

我试图使用Eclipse4.50在MacOSX 10.11.3上调用的FFMPEG包装库进行代码转换

我的Converter.java类如下所示:

package matador;

import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.InputFormatException;
import it.sauronsoftware.jave.Encoder;
import java.io.*;

public class Converter {

public static void main(String[] args) throws InputFormatException, EncoderException {

    File source = new File("Classic.m4a");
    File target = new File("target.mp3");

    AudioAttributes audio = new AudioAttributes();
    audio.setCodec("libmp3lame");
    audio.setBitRate(new Integer(128000));
    audio.setChannels(new Integer(2));
    audio.setSamplingRate(new Integer(44100));

    EncodingAttributes attrs = new EncodingAttributes();
    attrs.setFormat("mp3");
    attrs.setAudioAttributes(audio);

    Encoder encoder = new Encoder(new MyFFMPEGExecutableLocator());
    try {
    encoder.encode(source, target, attrs, null);
    } catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (InputFormatException e) {

        e.printStackTrace();
    } catch (EncoderException e) {

        e.printStackTrace();
    }

}

}
我遇到的问题是,对于特定的音频文件(无论格式如何),我会遇到以下问题:

it.sauronsoftware.jave.EncoderException:   Metadata:
at it.sauronsoftware.jave.Encoder.encode(Encoder.java:863)
at matador.Converter.main(Converter.java:32)
我查看了Encoder.java,第863行的EncoderException是以下特定代码:

} else if (!line.startsWith("Output #0")) {
throw new EncoderException(line);
我一直无法弄清楚为什么会发生这种情况,但特定的音频文件(WAV/AAC/etc)确实编码,但大多数人只是给出了这个例外

谢谢你的帮助

编辑:根据可能进一步帮助我的请求,以下是Encoder.java代码的全部内容:

package it.sauronsoftware.jave;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Encoder {

private static final Pattern FORMAT_PATTERN = Pattern
        .compile("^\\s*([D ])([E ])\\s+([\\w,]+)\\s+.+$");

private static final Pattern ENCODER_DECODER_PATTERN = Pattern.compile(
        "^\\s*([D ])([E ])([AVS]).{3}\\s+(.+)$", Pattern.CASE_INSENSITIVE);

private static final Pattern PROGRESS_INFO_PATTERN = Pattern.compile(
        "\\s*(\\w+)\\s*=\\s*(\\S+)\\s*", Pattern.CASE_INSENSITIVE);

private static final Pattern SIZE_PATTERN = Pattern.compile(
        "(\\d+)x(\\d+)", Pattern.CASE_INSENSITIVE);

private static final Pattern FRAME_RATE_PATTERN = Pattern.compile(
        "([\\d.]+)\\s+(?:fps|tb\\(r\\))", Pattern.CASE_INSENSITIVE);

private static final Pattern BIT_RATE_PATTERN = Pattern.compile(
        "(\\d+)\\s+kb/s", Pattern.CASE_INSENSITIVE);

private static final Pattern SAMPLING_RATE_PATTERN = Pattern.compile(
        "(\\d+)\\s+Hz", Pattern.CASE_INSENSITIVE);

private static final Pattern CHANNELS_PATTERN = Pattern.compile(
        "(mono|stereo)", Pattern.CASE_INSENSITIVE);

private static final Pattern SUCCESS_PATTERN = Pattern.compile(
        "^\\s*video\\:\\S+\\s+audio\\:\\S+\\s+global headers\\:\\S+.*$",
        Pattern.CASE_INSENSITIVE);

private FFMPEGLocator locator;

public Encoder() {
    this.locator = new DefaultFFMPEGLocator();
}

public Encoder(FFMPEGLocator locator) {
    this.locator = locator;
}

public String[] getAudioDecoders() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String decoderFlag = matcher.group(1);
                    String audioVideoFlag = matcher.group(3);
                    if ("D".equals(decoderFlag)
                            && "A".equals(audioVideoFlag)) {
                        String name = matcher.group(4);
                        res.add(name);
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("Codecs:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public String[] getAudioEncoders() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String encoderFlag = matcher.group(2);
                    String audioVideoFlag = matcher.group(3);
                    if ("E".equals(encoderFlag)
                            && "A".equals(audioVideoFlag)) {
                        String name = matcher.group(4);
                        res.add(name);
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("Codecs:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public String[] getVideoDecoders() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String decoderFlag = matcher.group(1);
                    String audioVideoFlag = matcher.group(3);
                    if ("D".equals(decoderFlag)
                            && "V".equals(audioVideoFlag)) {
                        String name = matcher.group(4);
                        res.add(name);
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("Codecs:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public String[] getVideoEncoders() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String encoderFlag = matcher.group(2);
                    String audioVideoFlag = matcher.group(3);
                    if ("E".equals(encoderFlag)
                            && "V".equals(audioVideoFlag)) {
                        String name = matcher.group(4);
                        res.add(name);
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("Codecs:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public String[] getSupportedEncodingFormats() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = FORMAT_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String encoderFlag = matcher.group(2);
                    if ("E".equals(encoderFlag)) {
                        String aux = matcher.group(3);
                        StringTokenizer st = new StringTokenizer(aux, ",");
                        while (st.hasMoreTokens()) {
                            String token = st.nextToken().trim();
                            if (!res.contains(token)) {
                                res.add(token);
                            }
                        }
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("File formats:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public String[] getSupportedDecodingFormats() throws EncoderException {
    ArrayList res = new ArrayList();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-formats");
    try {
        ffmpeg.execute();
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getInputStream()));
        String line;
        boolean evaluate = false;
        while ((line = reader.readLine()) != null) {
            if (line.trim().length() == 0) {
                continue;
            }
            if (evaluate) {
                Matcher matcher = FORMAT_PATTERN.matcher(line);
                if (matcher.matches()) {
                    String decoderFlag = matcher.group(1);
                    if ("D".equals(decoderFlag)) {
                        String aux = matcher.group(3);
                        StringTokenizer st = new StringTokenizer(aux, ",");
                        while (st.hasMoreTokens()) {
                            String token = st.nextToken().trim();
                            if (!res.contains(token)) {
                                res.add(token);
                            }
                        }
                    }
                } else {
                    break;
                }
            } else if (line.trim().equals("File formats:")) {
                evaluate = true;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
    int size = res.size();
    String[] ret = new String[size];
    for (int i = 0; i < size; i++) {
        ret[i] = (String) res.get(i);
    }
    return ret;
}

public MultimediaInfo getInfo(File source) throws InputFormatException,
        EncoderException {
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    ffmpeg.addArgument("-i");
    ffmpeg.addArgument(source.getAbsolutePath());
    try {
        ffmpeg.execute();
    } catch (IOException e) {
        throw new EncoderException(e);
    }
    try {
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getErrorStream()));
        return parseMultimediaInfo(source, reader);
    } finally {
        ffmpeg.destroy();
    }
}

private MultimediaInfo parseMultimediaInfo(File source,
        RBufferedReader reader) throws InputFormatException,
        EncoderException {
    Pattern p1 = Pattern.compile("^\\s*Input #0, (\\w+).+$\\s*",
            Pattern.CASE_INSENSITIVE);
    Pattern p2 = Pattern.compile(
            "^\\s*Duration: (\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d).*$",
            Pattern.CASE_INSENSITIVE);
    Pattern p3 = Pattern.compile(
            "^\\s*Stream #\\S+: ((?:Audio)|(?:Video)|(?:Data)): (.*)\\s*$",
            Pattern.CASE_INSENSITIVE);
    MultimediaInfo info = null;
    try {
        int step = 0;
        while (true) {
            String line = reader.readLine();
            if (line == null) {
                break;
            }
            if (step == 0) {
                String token = source.getAbsolutePath() + ": ";
                if (line.startsWith(token)) {
                    String message = line.substring(token.length());
                    throw new InputFormatException(message);
                }
                Matcher m = p1.matcher(line);
                if (m.matches()) {
                    String format = m.group(1);
                    info = new MultimediaInfo();
                    info.setFormat(format);
                    step++;
                }
            } else if (step == 1) {
                Matcher m = p2.matcher(line);
                if (m.matches()) {
                    long hours = Integer.parseInt(m.group(1));
                    long minutes = Integer.parseInt(m.group(2));
                    long seconds = Integer.parseInt(m.group(3));
                    long dec = Integer.parseInt(m.group(4));
                    long duration = (dec * 100L) + (seconds * 1000L)
                            + (minutes * 60L * 1000L)
                            + (hours * 60L * 60L * 1000L);
                    info.setDuration(duration);
                    step++;
                } else {
                    step = 3;
                }
            } else if (step == 2) {
                Matcher m = p3.matcher(line);
                if (m.matches()) {
                    String type = m.group(1);
                    String specs = m.group(2);
                    if ("Video".equalsIgnoreCase(type)) {
                        VideoInfo video = new VideoInfo();
                        StringTokenizer st = new StringTokenizer(specs, ",");
                        for (int i = 0; st.hasMoreTokens(); i++) {
                            String token = st.nextToken().trim();
                            if (i == 0) {
                                video.setDecoder(token);
                            } else {
                                boolean parsed = false;
                                // Video size.
                                Matcher m2 = SIZE_PATTERN.matcher(token);
                                if (!parsed && m2.find()) {
                                    int width = Integer.parseInt(m2
                                            .group(1));
                                    int height = Integer.parseInt(m2
                                            .group(2));
                                    video.setSize(new VideoSize(width,
                                            height));
                                    parsed = true;
                                }
                                // Frame rate.
                                m2 = FRAME_RATE_PATTERN.matcher(token);
                                if (!parsed && m2.find()) {
                                    try {
                                        float frameRate = Float
                                                .parseFloat(m2.group(1));
                                        video.setFrameRate(frameRate);
                                    } catch (NumberFormatException e) {
                                        ;
                                    }
                                    parsed = true;
                                }
                                // Bit rate.
                                m2 = BIT_RATE_PATTERN.matcher(token);
                                if (!parsed && m2.find()) {
                                    int bitRate = Integer.parseInt(m2
                                            .group(1));
                                    video.setBitRate(bitRate);
                                    parsed = true;
                                }
                            }
                        }
                        info.setVideo(video);
                    } else if ("Audio".equalsIgnoreCase(type)) {
                        AudioInfo audio = new AudioInfo();
                        StringTokenizer st = new StringTokenizer(specs, ",");
                        for (int i = 0; st.hasMoreTokens(); i++) {
                            String token = st.nextToken().trim();
                            if (i == 0) {
                                audio.setDecoder(token);
                            } else {
                                boolean parsed = false;
                                // Sampling rate.
                                Matcher m2 = SAMPLING_RATE_PATTERN
                                        .matcher(token);
                                if (!parsed && m2.find()) {
                                    int samplingRate = Integer.parseInt(m2
                                            .group(1));
                                    audio.setSamplingRate(samplingRate);
                                    parsed = true;
                                }
                                // Channels.
                                m2 = CHANNELS_PATTERN.matcher(token);
                                if (!parsed && m2.find()) {
                                    String ms = m2.group(1);
                                    if ("mono".equalsIgnoreCase(ms)) {
                                        audio.setChannels(1);
                                    } else if ("stereo"
                                            .equalsIgnoreCase(ms)) {
                                        audio.setChannels(2);
                                    }
                                    parsed = true;
                                }
                                // Bit rate.
                                m2 = BIT_RATE_PATTERN.matcher(token);
                                if (!parsed && m2.find()) {
                                    int bitRate = Integer.parseInt(m2
                                            .group(1));
                                    audio.setBitRate(bitRate);
                                    parsed = true;
                                }
                            }
                        }
                        info.setAudio(audio);
                    }
                } else {
                    step = 3;
                }
            }
            if (step == 3) {
                reader.reinsertLine(line);
                break;
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    }
    if (info == null) {
        throw new InputFormatException();
    }
    return info;
}

private Hashtable parseProgressInfoLine(String line) {
    Hashtable table = null;
    Matcher m = PROGRESS_INFO_PATTERN.matcher(line);
    while (m.find()) {
        if (table == null) {
            table = new Hashtable();
        }
        String key = m.group(1);
        String value = m.group(2);
        table.put(key, value);
    }
    return table;
}

public void encode(File source, File target, EncodingAttributes attributes)
        throws IllegalArgumentException, InputFormatException,
        EncoderException {
    encode(source, target, attributes, null);
}

public void encode(File source, File target, EncodingAttributes attributes,
        EncoderProgressListener listener) throws IllegalArgumentException,
        InputFormatException, EncoderException {
    String formatAttribute = attributes.getFormat();
    Float offsetAttribute = attributes.getOffset();
    Float durationAttribute = attributes.getDuration();
    AudioAttributes audioAttributes = attributes.getAudioAttributes();
    VideoAttributes videoAttributes = attributes.getVideoAttributes();
    if (audioAttributes == null && videoAttributes == null) {
        throw new IllegalArgumentException(
                "Both audio and video attributes are null");
    }
    target = target.getAbsoluteFile();
    target.getParentFile().mkdirs();
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    if (offsetAttribute != null) {
        ffmpeg.addArgument("-ss");
        ffmpeg.addArgument(String.valueOf(offsetAttribute.floatValue()));
    }
    ffmpeg.addArgument("-i");
    ffmpeg.addArgument(source.getAbsolutePath());
    if (durationAttribute != null) {
        ffmpeg.addArgument("-t");
        ffmpeg.addArgument(String.valueOf(durationAttribute.floatValue()));
    }
    if (videoAttributes == null) {
        ffmpeg.addArgument("-vn");
    } else {
        String codec = videoAttributes.getCodec();
        if (codec != null) {
            ffmpeg.addArgument("-vcodec");
            ffmpeg.addArgument(codec);
        }
        String tag = videoAttributes.getTag();
        if (tag != null) {
            ffmpeg.addArgument("-vtag");
            ffmpeg.addArgument(tag);
        }
        Integer bitRate = videoAttributes.getBitRate();
        if (bitRate != null) {
            ffmpeg.addArgument("-b");
            ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
        }
        Integer frameRate = videoAttributes.getFrameRate();
        if (frameRate != null) {
            ffmpeg.addArgument("-r");
            ffmpeg.addArgument(String.valueOf(frameRate.intValue()));
        }
        VideoSize size = videoAttributes.getSize();
        if (size != null) {
            ffmpeg.addArgument("-s");
            ffmpeg.addArgument(String.valueOf(size.getWidth()) + "x"
                    + String.valueOf(size.getHeight()));
        }
    }
    if (audioAttributes == null) {
        ffmpeg.addArgument("-an");
    } else {
        String codec = audioAttributes.getCodec();
        if (codec != null) {
            ffmpeg.addArgument("-acodec");
            ffmpeg.addArgument(codec);
        }
        Integer bitRate = audioAttributes.getBitRate();
        if (bitRate != null) {
            ffmpeg.addArgument("-ab");
            ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
        }
        Integer channels = audioAttributes.getChannels();
        if (channels != null) {
            ffmpeg.addArgument("-ac");
            ffmpeg.addArgument(String.valueOf(channels.intValue()));
        }
        Integer samplingRate = audioAttributes.getSamplingRate();
        if (samplingRate != null) {
            ffmpeg.addArgument("-ar");
            ffmpeg.addArgument(String.valueOf(samplingRate.intValue()));
        }
        Integer volume = audioAttributes.getVolume();
        if (volume != null) {
            ffmpeg.addArgument("-vol");
            ffmpeg.addArgument(String.valueOf(volume.intValue()));
        }
    }
    ffmpeg.addArgument("-f");
    ffmpeg.addArgument(formatAttribute);
    ffmpeg.addArgument("-y");
    ffmpeg.addArgument(target.getAbsolutePath());
    try {
        ffmpeg.execute();
    } catch (IOException e) {
        throw new EncoderException(e);
    }
    try {
        String lastWarning = null;
        long duration;
        long progress = 0;
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getErrorStream()));
        MultimediaInfo info = parseMultimediaInfo(source, reader);
        if (durationAttribute != null) {
            duration = (long) Math
                    .round((durationAttribute.floatValue() * 1000L));
        } else {
            duration = info.getDuration();
            if (offsetAttribute != null) {
                duration -= (long) Math
                        .round((offsetAttribute.floatValue() * 1000L));
            }
        }
        if (listener != null) {
            listener.sourceInfo(info);
        }
        int step = 0;
        String line;
        while ((line = reader.readLine()) != null) {
            if (step == 0) {
                if (line.startsWith("WARNING: ")) {
                    if (listener != null) {
                        listener.message(line);
                    }
                } else if (!line.startsWith("Output #0")) {
                    throw new EncoderException(line);
                } else {
                    step++;
                }
            } else if (step == 1) {
                if (!line.startsWith("  ")) {
                    step++;
                }
            }
            if (step == 2) {
                if (!line.startsWith("Stream mapping:")) {
                    throw new EncoderException(line);
                } else {
                    step++;
                }
            } else if (step == 3) {
                if (!line.startsWith("  ")) {
                    step++;
                }
            }
            if (step == 4) {
                line = line.trim();
                if (line.length() > 0) {
                    Hashtable table = parseProgressInfoLine(line);
                    if (table == null) {
                        if (listener != null) {
                            listener.message(line);
                        }
                        lastWarning = line;
                    } else {
                        if (listener != null) {
                            String time = (String) table.get("time");
                            if (time != null) {
                                int dot = time.indexOf('.');
                                if (dot > 0 && dot == time.length() - 2
                                        && duration > 0) {
                                    String p1 = time.substring(0, dot);
                                    String p2 = time.substring(dot + 1);
                                    try {
                                        long i1 = Long.parseLong(p1);
                                        long i2 = Long.parseLong(p2);
                                        progress = (i1 * 1000L)
                                                + (i2 * 100L);
                                        int perm = (int) Math
                                                .round((double) (progress * 1000L)
                                                        / (double) duration);
                                        if (perm > 1000) {
                                            perm = 1000;kMDItemAudioEncodingApplication = "Lavf57.26.100"
                                        }
                                        listener.progress(perm);
                                    } catch (NumberFormatException e) {
                                        ;
                                    }
                                }
                            }
                        }
                        lastWarning = null;
                    }
                }
            }
        }
        if (lastWarning != null) {
            if (!SUCCESS_PATTERN.matcher(lastWarning).matches()) {
                throw new EncoderException(lastWarning);
            }
        }
    } catch (IOException e) {
        throw new EncoderException(e);
    } finally {
        ffmpeg.destroy();
    }
}

}
package it.sauronsoftware.jave;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
导入java.util.Hashtable;
导入java.util.StringTokenizer;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类编码器{
私有静态最终模式格式\u Pattern=Pattern
.compile(“^\\s*([D])([E])\\s+([\\w,]+)\\s++$”;
专用静态最终模式编码器\解码器\模式=模式.compile(
“^\\s*([D])([E])([AVS])。{3}\\s++(.+)$”,模式。不区分大小写);
私有静态最终模式进度\u信息\u模式=Pattern.compile(
“\\s*(\\w+\\s*=\\s*(\\s+\\s*”,模式。不区分大小写);
私有静态最终模式大小\u Pattern=Pattern.compile(
“(\\d+)x(\\d+”,模式。不区分大小写);
私有静态最终模式FRAME\u RATE\u Pattern=Pattern.compile(
“([\\d.]+)\\s+(?:fps | tb\\(r\\)”,模式。不区分大小写);
私有静态最终模式位\速率\模式=模式.compile(
“(\\d+\\s+kb/s”,模式。不区分大小写);
私有静态最终模式采样率模式=Pattern.compile(
“(\\d+\\s+Hz”,模式。不区分大小写);
专用静态最终模式通道\u Pattern=Pattern.compile(
“(单声道立体声)”,模式。不区分大小写);
私有静态最终模式成功\u Pattern=Pattern.compile(
“^\\s*视频\\:\\s+\\s+音频\\:\\s+\\s+全局标题\\:\\s+.*$”,
模式(不区分大小写);
专用FFMPEGLocator定位器;
公共编码器(){
this.locator=new DefaultFFMPEGLocator();
}
公共编码器(FFMPEGLocator定位器){
this.locator=定位器;
}
公共字符串[]getAudioDecoders()引发编码器异常{
ArrayList res=新的ArrayList();
FFMPEGExecutor ffmpeg=locator.createExecutor();
addArgument(“-formats”);
试一试{
ffmpeg.execute();
RBUFFEREADER读取器=空;
reader=新的RBuffereReader(新的InputStreamReader(ffmpeg
.getInputStream());
弦线;
布尔值=假;
而((line=reader.readLine())!=null){
如果(line.trim().length()==0){
继续;
}
如果(评估){
匹配器匹配器=编码器\解码器\模式匹配器(线);
if(matcher.matches()){
字符串decoderFlag=matcher.group(1);
字符串audioVideoFlag=matcher.group(3);
如果(“D”。等于(解码滞后)
&&“A”。等于(音频视频标志)){
字符串名称=matcher.group(4);
决议增补(名称);
}
}否则{
打破
}
}else if(line.trim().equals(“编解码器:)){
评估=正确;
}
}
}捕获(IOE异常){
抛出新的异常(e);
}最后{
ffmpeg.destroy();
}
int size=res.size();
字符串[]ret=新字符串[大小];
对于(int i=0;iEncoder encoder = new Encoder(new MyFFMPEGExecutableLocator());
try {
encoder.encode(source, target, attrs, null);
} catch (IllegalArgumentException e) {

    e.printStackTrace();
} catch (InputFormatException e) {

    e.printStackTrace();
} catch (EncoderException e) {

    e.printStackTrace();
}
Encoder encoder = new Encoder();

try{

encoder.encode(source, target, attrs);}

catch(Exception e){

System.out.println("Encoding Failed");
}