use java-ffmpeg wrapper, or simply use java runtime to execute ffmpeg?
Solution 1
If I'm not mistaken, the "ffmpeg-wrapper" project you linked to is out of date and not maintained. FFmpeg is a very active project, lot's of changes and releases all the time.
You should look at the Xuggler project, this provides a Java API for what you want to do, and they have tight integration with FFmpeg.
http://www.xuggle.com/xuggler/
Should you choose to go down the Runtime.exec()
path, this Red5 thread should be useful:
http://www.nabble.com/java-call-ffmpeg-ts15886850.html
Solution 2
I too am looking for something to wrap FFMPEG in Java. While searching, I found this: https://github.com/bramp/ffmpeg-cli-wrapper.
As of today, it seems to have been modified a month ago. So, hopefully it will stick around for a while.
A sample from their docs:
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();
Solution 3
There are a lot of Java libraries providing FFMPEG wrappers. However, most of these libraries are unfortunately outdated and use old FFMPEG versions which lack some important codecs (e.g. Xuggler, humble video, JavaAV, JavaAVC, and jave). So be careful when using those projects!
However, there is one FFMPEG wrapper that is still actively developed and supports FFMPEG 4:
- JavaCPP FFMPEG - with fully bundled maven artefacts
Alternatively you can use a wrapper for the command line interface of FFMPEG, such as ffmpeg-cli-wrapper. Then it's in your hand to update ffmpeg manually without having to wait for a new release of the wrapper library.
Solution 4
I wrote my own Java ffmpeg command line wrapper: Jaffree. It works with both ffprobe and ffmpeg and supports programmatic video production and consumption. Also it has in my opinion more convenient fluid API.
Here is an ffprobe usage example:
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
}
};
And this is for ffmpeg:
FFmpegResult result = FFmpeg.atPath(BIN)
.addInput(Input.fromPath(VIDEO_MP4))
.addOutput(Output.toPath(outputPath)
.addCodec(null, "copy")
)
.setProgressListener(listener)
.execute();
Solution 5
Also, as of Xuggler 3.3, Xuggler is LGPL meaning you don't need a commercial license.
Beier
Updated on July 09, 2022Comments
-
Beier almost 2 years
I'm pretty new to Java, need to write a program that listen to video conversion instructions and convert the video once an new instruction arrives (instructions is stored in Amazon SQS, but it's irrelevant to my question)
I'm facing a choice, either use Java RunTime to exec 'ffmpeg' conversion (like from command line), or I can use a ffmpeg wrapper written inJava http://fmj-sf.net/ffmpeg-java/getting_started.php
I'd much prefer using Java Runtime to exec ffmpeg directly, and avoid using java-ffmpeg wrapper as I have to learn the library. so my question is are there any benefits using java-ffmpeg wrapper over exec ffmpeg directly using Runtime? I don't need ffmpeg to play videos, just convert videos
Thanks
-
Beier almost 15 yearsjust took a brief look at xuggler documentation, exactly what I need. thanks for helping!
-
Peter Thomas almost 15 yearsGreat. Just be aware that it is GPL, you may need a commercial license in production.
-
Art Clarke over 14 yearsActually Xuggler is now LGPL (although it will be GPL if you use it with libx264)
-
Felix about 11 yearsDoes it support converting images and mp3 to a video file? thanks
-
VijayM almost 9 yearsdoes it has solution to extract the audio or video meta info?
-
cyril about 7 yearsyes using ffprobe go on website on github you will see an example
-
saurabheights almost 7 yearsHi, how can one manage java interface library when ffprobe xsd changes over every ffmpeg version? P.S. My approach was similar to yours, but this issue makes me stick to one specific ffmpeg version.
-
Denis Kokorin almost 7 yearsI tested only on latest ffmpeg version, there is an option "bit exact output".
-
Bass over 5 yearsThe library doesn't support termination of the child process (should you wish to capture a video from your screen), nor does it expose the process to the client. Given that
ffmpeg
is very well documented, you're better off runningffmpeg
manually via thejava.lang.Process
API. -
Bass over 5 yearsJAVE is only good because it bundles
ffmpeg
binaries for all mainstream platforms. Their Java API is a mess, however. -
Xinyuan.Yan about 4 yearsXuggler is on hiatus now. xuggle.com/xuggler/status github.com/artclarke/xuggle-xuggler
-
Cardinal System over 3 yearsLooks like this is outdated now
-
Awad about 2 yearsDo you have examples on how this can be used with input being WebSocket or multiple MP4s?