Использовать оболочку 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 для воспроизведения видео, просто конвертируйте видео
Спасибо
Ответы
Ответ 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
Преимущества использования обертки будут в основном состоять в том, что он предлагает больше и мелкозернистую функциональность, недоступную через командную строку (не относящуюся к вам), и упрощает обработку ошибок и управление статусом - вам придется анализировать команду стандартный инструмент вывода и потоки ошибок.
Ответ 5
вы можете попробовать jave
http://www.sauronsoftware.it/projects/jave
Ответ 6
Существует много библиотек Java, обеспечивающих обертки FFMPEG. Однако большинство из этих библиотек, к сожалению, устарели и используют старые версии FFMPEG, в которых отсутствуют некоторые важные кодеки (например, Xuggler, скромное видео, JavaAV, JavaAVC и jave). Поэтому будьте осторожны при использовании этих проектов!
Однако существует одна обертка FFMPEG, которая активно активно развивается и поддерживает FFMPEG 3:
В качестве альтернативы вы можете использовать оболочку для интерфейса командной строки 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 и других я нашел это слишком сложно