How to Utilize Jaffree: A Guide to the JAva FFmpeg and FFprobe Wrapper

Aug 18, 2024 | Programming

In the realm of programmatic video production, dealing with media files requires robust tools. One such tool is Jaffree, a powerful Java wrapper for FFmpeg and FFprobe, enabling video production and consumption with transparency. This article walks you through some practical usages of Jaffree, giving you a clear roadmap for effective implementation.

Getting Started with Jaffree

Before diving into the code, ensure you have JDK 8, 11, or 17 and Maven set up in your development environment. Jaffree supports operation across major operating systems, including Ubuntu, MacOS, and Windows.

Dependency Setup

  • Add Jaffree to your Maven project by including the following XML dependency:
<dependency>
    <groupId>com.github.kokorin.jaffree</groupId>
    <artifactId>jaffree</artifactId>
    <version>$jaffree.version</version>
</dependency>
<!-- Include SLF4J for logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

Using Jaffree for Common Tasks

Jaffree provides numerous functionalities for media management. The operations can be visualized as different workshops, where each workshop has its own specialized purpose. Let’s break down some practical examples:

1. Checking Media Streams with FFprobe

This operation is akin to reviewing a manuscript before it goes to print. You get to examine all details:

FFprobeResult result = FFprobe.atPath()
    .setShowStreams(true)
    .setInput(pathToVideo)
    .execute();
for (Stream stream : result.getStreams()) {
    System.out.println("Stream #" + stream.getIndex() +
        " type: " + stream.getCodecType() +
        " duration: " + stream.getDuration() + " seconds");
}

2. Detecting Exact Media File Duration

Imagine you want the world’s best recipe. Sometimes, just reading it isn’t enough; you need to try it yourself:

final AtomicLong durationMillis = new AtomicLong();
FFmpegResult ffmpegResult = FFmpeg.atPath()
    .addInput(UrlInput.fromUrl(pathToVideo))
    .addOutput(new NullOutput())
    .setProgressListener(new ProgressListener() {
        @Override
        public void onProgress(FFmpegProgress progress) {
            durationMillis.set(progress.getTimeMillis());
        }
    })
    .execute();
System.out.println("Exact duration: " + durationMillis.get() + " milliseconds");

3. Re-encode and Track Progress

When you’re editing a video, you want to know how much of it has been completed—like checking the status of a cake in the oven:

final AtomicLong duration = new AtomicLong();
FFmpeg.atPath()
    .addInput(UrlInput.fromUrl(pathToSrc))
    .setOverwriteOutput(true)
    .addOutput(new NullOutput())
    .setProgressListener(new ProgressListener() {
        @Override
        public void onProgress(FFmpegProgress progress) {
            duration.set(progress.getTimeMillis());
        }
    })
    .execute();
// Continue to re-encode with output
FFmpeg.atPath()
    .addInput(UrlInput.fromUrl(pathToSrc))
    .setOverwriteOutput(true)
    .addArguments("-movflags", "faststart")
    .addOutput(UrlOutput.toUrl(pathToDst))
    .setProgressListener(new ProgressListener() {
        @Override
        public void onProgress(FFmpegProgress progress) {
            double percents = 100. * progress.getTimeMillis() / duration.get();
            System.out.println("Progress: " + percents + "%");
        }
    })
    .execute();

Troubleshooting

While using Jaffree, you might encounter some issues. Here are a few common problems and how to handle them:

  • Issue: FFmpeg does not return expected results.
    • Ensure that your FFmpeg installation is working correctly by executing basic FFmpeg commands in the terminal.
  • Issue: Exceptions when executing commands.
    • Use the -xerror argument to ensure FFmpeg exits with an error status when an error occurs.

For more insights, updates, or to collaborate on AI development projects, stay connected with fxis.ai.

Conclusion

Jaffree brings the power of FFmpeg and FFprobe into a Java wrapper, allowing for seamless video processing capabilities. By following the outlined usage and tackling possible troubleshooting issues, you can harness its full potential.

At fxis.ai, we believe that such advancements are crucial for the future of AI, as they enable more comprehensive and effective solutions. Our team is continually exploring new methodologies to push the envelope in artificial intelligence, ensuring that our clients benefit from the latest technological innovations.

Stay Informed with the Newest F(x) Insights and Blogs

Tech News and Blog Highlights, Straight to Your Inbox