it-swarm.com.ru

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

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

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

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

Спасибо

36
Beier

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

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

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

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

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

34
Peter Thomas

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

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

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

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

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

8
Stefan Endrullis

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

8
Art Clarke

Я написал свою собственную оболочку командной строки 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();
6
Denis Kokorin

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

4
sohilv

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

3
Michael Borgwardt

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

0
cyril