使用java-ffmpeg包装器,还是只使用java运行时执行ffmpeg?

时间:2009-08-15 06:59:24

标签: java ffmpeg runtime.exec

我对Java很陌生,需要编写一个程序来收听视频转换指令并在新指令到达后转换视频(指令存储在Amazon SQS中,但这与我的问题无关)

我正面临一个选择,要么使用Java RunTime来执行'ffmpeg'转换(比如从命令行),要么我可以使用用Java编写的ffmpeg包装http://fmj-sf.net/ffmpeg-java/getting_started.php

我更喜欢使用Java Runtime直接执行ffmpeg,并且避免使用java-ffmpeg包装器,因为我必须学习库。所以我的问题是使用java-ffmpeg包装器直接使用运行时使用exec ffmpeg有什么好处吗?我不需要ffmpeg来播放视频,只需转换视频

由于

8 个答案:

答案 0 :(得分:35)

如果我没弄错的话,你链接的“ffmpeg包装”项目已经过时而没有维护。 ffmpeg是一个非常活跃的项目,很多都是变化和发布的。

你应该看看Xuggler项目,它为你想要做的事情提供了一个Java API,并且它们与ffmpeg紧密集成。

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

如果你选择沿着Runtime.exec()路径走下去,这个Red5线程应该是有用的:

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

答案 1 :(得分:21)

我也在寻找用Java包装FFMPEG的东西。在搜索时,我发现了这一点: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();

答案 2 :(得分:9)

有很多Java库提供FFMPEG包装器。然而,遗憾的是,大多数这些库已经过时,并且使用了缺少一些重要编解码器的旧FFMPEG版本(例如Xuggler,简陋的视频,JavaAV,JavaAVC和jave)。所以在使用这些项目时要小心!

但是,还有一个FFMPEG包装器仍然积极开发并支持 FFMPEG 3

或者,您可以使用FFMPEG命令行界面的包装器,例如ffmpeg-cli-wrapper。然后,您可以手动更新ffmpeg,而无需等待包装库的新版本。

答案 3 :(得分:8)

此外,从Xuggler 3.3开始,Xuggler是LGPL意味着您不需要商业许可。

答案 4 :(得分:8)

我编写了自己的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();

答案 5 :(得分:4)

答案 6 :(得分:3)

使用包装器的好处主要在于它提供了更多细粒度的功能,无法通过命令行访问(与您无关),并且使错误处理和状态控制更容易 - 您必须解析命令线工具的标准输出和错误流。

答案 7 :(得分:0)

我尝试了几种方法,对我来说最简单的是ffmpeg-cli-wrapper,因为它使用默认的ffmpeg或特定的一种,而且你可以配置很多配置,比如scale,bitrate ...... get duration ... JAVE from sauronsoftware犯了很多错误,XUGGLE和其他我发现它太复杂了