前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java调用外部应用程序

java调用外部应用程序

作者头像
sucl
发布2019-08-07 14:25:26
3.6K1
发布2019-08-07 14:25:26
举报
文章被收录于专栏:企业平台构建

最近因为需要做视频文件转换,在网上找了下,比较多的推荐是使用ffmpeg来实现,于是准备在java语言的基础上去实现,经过分析其实就是调用ffmpeg提供的应用命令去完成。

代码语言:javascript
复制
ffmpeg -i input.mp4 output.avi

在java中调用外部应用一般都会使用

代码语言:javascript
复制
Runtime.getRuntime().exec();

以前其实也使用过,但是没有过深入的研究,在使用是发现也会有各种无法预料的问题出现,简单的调用过程如下:

代码语言:javascript
复制
Process p = Runtime.getRuntime().exec("ffmpeg -i ..\\demo\\1.flv ..\\demo\\6.mp4",null,new File("E:\\tools\\ffmpeg\\bin"));
InputStream fis=p.getInputStream();
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
String line=null;
while((line=br.readLine())!=null){
    System.out.println(line);
}

然而并没有出现预想的结果,反而出错了!

代码语言:javascript
复制
Exception in thread "main" java.io.IOException: Cannot run program "ffmpeg" (in directory "E:\tools\ffmpeg\bin"): CreateProcess error=2, 系统找不到指定的文件。
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:450)
    at com.nikoyo.avc.Test.main(Test.java:20)
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

目录中没有应用ffmpeg?

百思不得其解。

回过头来看看,刚的exec方法,主要是三个参数:

  1. 命令以及参数 start dir;explore dir等
  2. 运行环境,解析${}
  3. 工作目录,按照我的理解应该相当于cmd中cd到的目录进行执行程序

那到底是什么原因导致无法找到ffmpeg程序?

最后其实在ffmpeg命令前添加 cmd /c 即可,但是百度cmd /c 主要的作用是在执行脚本时保持关闭当前窗口。具体是什么原因导致这样的差别而引起程序运行的怪异现象?

当然在实际项目中,使用的其实是apache commons-exec,使用上其实差不多,主要是在过程中做了一些处理,针对一些问题进行了封装,同时引入了一些类似于监控狗处理超时,输出使用了现场处理,同时使用了异步模式处理。

代码语言:javascript
复制
String dir = "F:\\project\\AVC\\trunk\\src\\avc\\src\\main\\resources\\script";
        CommandLine cmdLine = new CommandLine( new File(dir,"ffmpeg1.bat"));
        cmdLine.addArgument("E:\\tools\\ffmpeg\\bin");
        cmdLine.addArgument("E:\\tools\\ffmpeg\\demo\\1.flv");
        cmdLine.addArgument("E:\\tools\\ffmpeg\\demo\\4.mp4");
        Executor exec = new DefaultExecutor();
//        exec.setWorkingDirectory(new File());
        DefaultExecuteResultHandler handler = new DefaultExecuteResultHandler();
        try {
            exec.execute(cmdLine, handler);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            handler.waitFor(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(handler.getException()!=null){
            try {
                throw handler.getException();
            } catch (ExecuteException e) {
                e.printStackTrace();
            }
        }

使用的是脚本完成:

代码语言:javascript
复制
set PATH=%PATH%;%1
ffmpeg.exe -i %2 %3
pause

同样会遇到上面的问题,目前仅作为问题记录,后期回头深入研究再做处理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档