52

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

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

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

谢谢

4

8 回答 8

37

如果我没记错的话,您链接到的“ffmpeg 包装器”项目已过时且未维护。ffmpeg 是一个非常活跃的项目,一直有很多变化和发布。

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

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

如果您选择走 Runtime.exec() 路径,这个 Red5 线程应该很有用:

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

于 2009-08-15T08:19:35.247 回答
23

我也在寻找用 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();
于 2015-08-26T15:03:30.383 回答
19

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

但是,有一个 FFMPEG 包装器仍在积极开发并支持FFMPEG 4

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

于 2016-08-08T13:51:42.860 回答
12

我编写了自己的 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();
于 2017-06-12T18:01:04.863 回答
8

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

于 2009-11-06T21:29:49.243 回答
4

你可以试试jave http://www.sauronsoftware.it/projects/jave

于 2010-04-01T11:12:20.087 回答
3

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

于 2009-08-15T07:34:14.480 回答
0

我尝试了几种方法,对我来说最简单的是ffmpeg-cli-wrapper,因为它使用默认的ffmpeg或特定的,而且你可以配置很多配置,如比例,比特率......获取持续时间......来自sauronsoftware的JAVE做很多错误,XUGGLE 和其他我发现它太复杂了

于 2017-05-31T11:25:34.970 回答