Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Если вы решили перейти по пути Runtime.exec(), этот поток Red5 должен быть полезен:

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

Ответ 2

Я тоже ищу что-то, чтобы обернуть 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();

Ответ 3

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

Ответ 4

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

Ответ 6

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

Однако существует одна обертка FFMPEG, которая активно активно развивается и поддерживает FFMPEG 3:

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

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

Ответ 7

Я написал свою собственную оболочку командной строки Java ffmpeg: Jaffree. Он работает как с ffprobe, так и с ffmpeg. Кроме того, это, на мой взгляд, более удобный жидкостный 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();

Ответ 8

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