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

Bei*_*ier 37 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来播放视频,只需转换视频

谢谢

Pet*_*mas 35

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

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

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

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

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

  • Xuggle项目已关闭http://blog.xuggle.com/2013/02/05/on-hiatus/ (12认同)
  • 现在看来这已经过时了 (3认同)
  • 实际上Xuggler现在是LGPL(如果你将它与libx264一起使用它将是GPL) (2认同)

mat*_*scb 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();
Run Code Online (Sandbox Code Playgroud)

  • 该库不支持终止子进程(如果您希望从屏幕捕获视频),也不会将进程公开给客户端。鉴于“ffmpeg”有很好的文档记录,您最好通过“java.lang.Process” API 手动运行“ffmpeg”。 (2认同)

Ste*_*lis 9

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

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

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


Art*_*rke 8

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


Den*_*rin 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
    }
};
Run Code Online (Sandbox Code Playgroud)

这是针对ffmpeg的:

FFmpegResult result = FFmpeg.atPath(BIN)
        .addInput(Input.fromPath(VIDEO_MP4))
        .addOutput(Output.toPath(outputPath)
                .addCodec(null, "copy")
        )
        .setProgressListener(listener)
        .execute();
Run Code Online (Sandbox Code Playgroud)