我对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来播放视频,只需转换视频
由于
答案 0 :(得分:35)
如果我没弄错的话,你链接的“ffmpeg包装”项目已经过时而没有维护。 ffmpeg是一个非常活跃的项目,很多都是变化和发布的。
你应该看看Xuggler项目,它为你想要做的事情提供了一个Java API,并且它们与ffmpeg紧密集成。
http://www.xuggle.com/xuggler/
如果你选择沿着Runtime.exec()路径走下去,这个Red5线程应该是有用的:
答案 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和其他我发现它太复杂了