Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java ffmpeg包装器,还是简单地使用java运行时来执行ffmpeg?_Java_Ffmpeg_Runtime.exec - Fatal编程技术网

使用java ffmpeg包装器,还是简单地使用java运行时来执行ffmpeg?

使用java ffmpeg包装器,还是简单地使用java运行时来执行ffmpeg?,java,ffmpeg,runtime.exec,Java,Ffmpeg,Runtime.exec,我对Java相当陌生,需要编写一个程序来听视频转换指令,并在新指令到达时转换视频(指令存储在Amazon SQS中,但与我的问题无关) 我面临一个选择,要么使用Java运行时执行“ffmpeg”转换(如从命令行),要么使用inJava编写的ffmpeg包装器 我更喜欢使用Java运行时直接执行ffmpeg,并避免使用Java ffmpeg包装器,因为我必须学习该库。所以我的问题是,使用java ffmpeg包装器比直接使用运行时的exec ffmpeg有什么好处?我不需要ffmpeg来播放视频,

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

我面临一个选择,要么使用Java运行时执行“ffmpeg”转换(如从命令行),要么使用inJava编写的ffmpeg包装器

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


多亏了

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

如果我没有弄错的话您链接到的“ffmpeg包装器”项目已过期且未维护。ffmpeg是一个非常活跃的项目,随时都有大量的更改和发布

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

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


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

您可以试试jave

我也在寻找用Java包装FFMPEG的东西。在搜索时,我发现了以下内容:

到今天为止,它似乎已经在一个月前被修改过了。所以,希望它能保留一段时间

他们文档中的样本:

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

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

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

  • -完全捆绑maven工艺品

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

我尝试了几种方法,对我来说最简单的是FFMPEG cli包装器,因为它使用默认FFMPEG或特定的FFMPEG,而且您可以配置很多配置,如缩放、比特率…获取持续时间…sauronsoftware的JAVE犯了很多错误,XUGGLE和其他我发现它太复杂了

我编写了自己的Java ffmpeg命令行包装器:。它与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();

只是简单地看了一下Xugler文档,这正是我所需要的。感谢您的帮助!太好了。请注意,它是GPL,您可能需要在生产中获得商业许可证。实际上Xugler现在是LGPL(尽管如果您将其与libx264一起使用,它将是GPL)Xuggler现在处于中断状态。看起来这已经过时了。它是否支持将图像和mp3转换为视频文件?感谢它是否有提取音频或视频元信息的解决方案?是的,使用ffprobe在github上的网站,您将看到一个示例库不支持终止子进程(如果您希望从屏幕捕获视频),也不会向客户端公开流程。鉴于
ffmpeg
有很好的文档记录,您最好通过
java.lang.process
API手动运行
ffmpeg
。嗨,当ffprobe xsd在每个ffmpeg版本上都发生变化时,如何管理java接口库?当然,我的方法与您的方法类似,但这是我的ssue让我坚持使用一个特定的ffmpeg版本。我只在最新的ffmpeg版本上进行了测试,有一个选项“精确位输出”。它之所以好,是因为它为所有主流平台捆绑了
ffmpeg
二进制文件。然而,它们的Java API非常混乱。