используйте оболочку java-ffmpeg или просто используйте Java runtime для выполнения ffmpeg?

Я довольно новичок в Java, нужно написать программу, которая слушает инструкции по преобразованию видео и конвертирует видео после поступления новой инструкции (инструкции хранятся в Amazon SQS, но это не имеет отношения к моему вопросу)

Я стою перед выбором: либо использовать Java RunTime для преобразования exec 'ffmpeg' (например, из командной строки), либо я могу использовать обертку ffmpeg, написанную inJavahttp://fmj-sf.net/ffmpeg-java/getting_started.php

Я бы предпочел использование Java Runtime для прямого выполнения ffmpeg и избегайте использования Java-ffmpeg wrapper, поскольку мне нужно изучить библиотеку. Итак, мой вопрос: есть ли какие-либо преимущества использования Java-ffmpeg wrapper над exec ffmpeg напрямую с помощью среды выполнения? Мне не нужен ffmpeg для воспроизведения видео, просто конвертируйте видео

спасибо

8 ответов


Если я не ошибаюсь, проект "ffmpeg wrapper", с которым вы связаны, устарел и не поддерживается. ffmpeg - очень активный проект, много изменений и релизов все время.

вы должны посмотреть на проект Xuggler, это обеспечивает API Java для того, что вы хотите сделать, и они имеют тесную интеграцию с ffmpeg.

http://www.xuggle.com/xuggler/

Если вы решите спуститься во время выполнения.путь exec (), этот поток Red5 должен пригодиться:

http://www.nabble.com/java-call-ffmpeg-ts15886850.html


Я тоже ищу что-то, чтобы обернуть FFMPEG в Java. Во время поиска я нашел следующее:https://github.com/bramp/ffmpeg-cli-wrapper.

на сегодняшний день он, кажется, был изменен месяц назад. Так что, надеюсь, это продержится какое-то время.

пример из их документов:

FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg");
FFprobe ffprobe = new FFprobe("/path/to/ffprobe");

FFmpegBuilder builder = new FFmpegBuilder()
    .setInput(in)
    .overrideOutputFiles(true)
    .addOutput("output.mp4")
        .setFormat("mp4")
        .setTargetSize(250000)

        .disableSubtitle()

        .setAudioChannels(1)
        .setAudioCodec("libfdk_aac")
        .setAudioRate(48000)
        .setAudioBitrate(32768)

        .setVideoCodec("libx264")
        .setVideoFramerate(Fraction.getFraction(24, 1))
        .setVideoResolution(640, 480)

        .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL)
        .done();

FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
executor.createTwoPassJob(builder).run();

кроме того, начиная с Xuggler 3.3, Xuggler-это LGPL, что означает, что вам не нужна коммерческая лицензия.


существует множество библиотек Java, предоставляющих обертки FFMPEG. Однако большинство этих библиотек, к сожалению, устарели и используют старые версии FFMPEG, в которых отсутствуют некоторые важные кодеки (например, Xuggler, humble video, JavaAV, JavaAVC и jave). Поэтому будьте осторожны при использовании этих проектов!

однако есть одна обертка FFMPEG, которая по-прежнему активно развивается и обслуживает ffmpeg с 3 тоже:

  • JavaCPP FFMPEG - с полностью упакованными артефактами maven

в качестве альтернативы вы можете использовать оболочку для интерфейса командной строки FFMPEG, например ffmpeg-cli-wrapper. Тогда это в ваших руках, чтобы обновить ffmpeg вручную, не дожидаясь нового выпуска библиотеки оболочки.


Я написал свою собственную оболочку командной строки Java ffmpeg:Jaffree. Он работает как с ffprobe, так и с ffmpeg и поддерживает программное производство и потребление видео. Также он имеет, на мой взгляд, более удобный fluid API.

вот пример использования ffprobe:

FFprobeResult result = FFprobe.atPath(BIN)
        .setInputPath(VIDEO_MP4)
        .setShowStreams(true)
        .setShowError(true)
        .execute();

if (result.getError() != null) {
    //TODO handle ffprobe error message
    return;
}

for (Stream stream : probe.getStreams().getStream()) {
    //TODO analyze stream data
}

ProgressListener listener = new ProgressListener() {
    @Override
    public void onProgress(FFmpegProgress progress) {
        //TODO handle progress data
    }
};

и это для ffmpeg:

FFmpegResult result = FFmpeg.atPath(BIN)
        .addInput(Input.fromPath(VIDEO_MP4))
        .addOutput(Output.toPath(outputPath)
                .addCodec(null, "copy")
        )
        .setProgressListener(listener)
        .execute();

вы можете попробовать jave http://www.sauronsoftware.it/projects/jave


преимущества использования обертки в основном заключаются в том, что она предлагает больше и мелкозернистые функции, недоступные через командную строку (не относящиеся к вам), и упрощает обработку ошибок и контроль состояния-вам придется анализировать стандартные выходные данные и потоки ошибок инструмента командной строки.


Я пробую несколько способов, Самый простой для меня-ffmpeg-cli-wrapper, потому что он использует ffmpeg по умолчанию или конкретный, кроме того, вы можете настроить много конфигурации, такой как масштаб, битрейт... получить продолжительность... JAVE от sauronsoftware делает много ошибок, XUGGLE и другие, я нашел это слишком сложным