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
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)
有很多Java库提供FFMPEG包装器.然而,遗憾的是,大多数这些库已经过时,并且使用了缺少一些重要编解码器的旧FFMPEG版本(例如Xuggler,简陋的视频,JavaAV,JavaAVC和jave).所以在使用这些项目时要小心!
但是,还有一个FFMPEG包装器仍然在积极开发并支持FFMPEG 3:
或者,您可以使用FFMPEG命令行界面的包装器,例如ffmpeg-cli-wrapper.然后,您可以手动更新ffmpeg,而无需等待包装库的新版本.
我编写了自己的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)