使用Java的ffmpeg的包装,或者干脆用java运行时执行的ffmpeg?(use java-f

2019-06-18 11:32发布

我很新到Java,需要编写听视频转换指令的程序和转换的视频曾经是一个新的指令到来(指令存储在亚马逊的SQS,但它是不相关的我的问题)

我现在面临一个选择,既可以使用Java运行时给exec'的ffmpeg的转换(例如来自命令行),或我可以使用写入一个FFMPEG包装inJava http://fmj-sf.net/ffmpeg-java/getting_started.php

我更喜欢使用Java运行时直接exec的ffmpeg的,并避免使用Java的ffmpeg的包装,因为我有学习库。 所以我的问题是是否有使用Java的ffmpeg的包装过高管的ffmpeg直接使用运行任何好处? 我不需要ffmpeg的播放视频,只需将视频转换

谢谢

Answer 1:

如果我没有记错的话,你挂了“的ffmpeg包装”项目是过时的,而不是维护。 ffmpeg的是一个非常活跃的项目,变更和发布的很多的所有的时间。

你应该看看Xuggler项目,这提供了一个Java API为你想要做什么,以及他们与ffmpeg的紧密集成。

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

如果您选择走下来的Runtime.exec()的路径,这Red5的线程应该是有用的:

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



Answer 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();


Answer 3:

现在有很多提供FFMPEG包装中的Java库。 然而,大多数这些库是不幸的是过时的和使用缺乏一些重要的编解码器(如Xuggler,不起眼的视频,JavaAV,JavaAVC,并安装插件)旧版本的FFMPEG。 因此,使用这些项目时要小心!

但是,是仍然在继续开发和支持FFMPEG 3,过一个FFMPEG包装:

  • JavaCPP FFMPEG -具有完全捆绑的Maven文物

或者,也可以使用包装为FFMPEG的命令行界面,如FFMPEG-CLI-包装 。 然后,它在你的手,而不必等待包装库的新版本,手动更新的ffmpeg。



Answer 4:

此外,作为Xuggler 3.3,Xuggler是LGPL的意思你不需要商业许可证。



Answer 5:

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


Answer 6:

你可以尝试安装插件http://www.sauronsoftware.it/projects/jave



Answer 7:

使用包装的好处将主要在于它提供了通过命令行(你无关)无法访问越来越精细的功能,使错误处理和状态控制更容易 - 你必须解析命令行工具的标准输出和错误流。



Answer 8:

我尝试几种方法,最简单的对我来说是ffmpeg的-CLI-包装,因为它使用默认的ffmpeg或特定的一个,而且可以配置很像规模,码率配置......从sauronsoftware化妆很多时间得到JAVE ...错误的,XUGGLE等我发现它太复杂



文章来源: use java-ffmpeg wrapper, or simply use java runtime to execute ffmpeg?