java 调用 su,java调用外部应用程序

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

ffmpeg -i input.mp4 output.avi

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

Runtime.getRuntime().exec();

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

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

}

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

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.(ProcessImpl.java:386)

at java.lang.ProcessImpl.start(ProcessImpl.java:137)

at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

目录中没有应用ffmpeg?

3cb02a85a98dd5ba181d014518b853fc.png

百思不得其解。

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

命令以及参数 start dir;explore dir等

运行环境,解析${}

工作目录,按照我的理解应该相当于cmd中cd到的目录进行执行程序

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

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

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

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

}

}

使用的是脚本完成:

set PATH=%PATH%;%1

ffmpeg.exe -i %2 %3

pause

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

在机器人操作系统(ROS)中,机器视觉是机器人感知和理解周围环境的关键技术。robot_vision功能包专注于这一领域,集成了多种视觉处理技术,包括摄像头标定、OpenCV库应用、人脸识别、物体跟踪、维码识别和物体识别,极大地拓展了ROS在视觉应用方面的能力。 摄像头标定:作为机器视觉的基础,摄像头标定用于消除镜头畸变并获取相机的内参和外参。在ROS中,camera_calibration包提供了友好的用户界面和算法,帮助计算相机参数矩阵,为后续的图像校正和三维重建提供支持。 OpenCV:OpenCV是一个广泛使用的开源计算机视觉库,在ROS中扮演着重要角色。robot_vision功能包可能包含OpenCV的示例代码和节点,涵盖图像处理、特征检测、模板匹配和图像分割等功能,这些功能对机器人视觉系统至关重要。 人脸识别:ROS中的人脸识别结合了图像处理和机器学习技术。robot_vision可能集成了基于OpenCV的人脸检测算法,如Haar级联分类器或Adaboost方法,甚至可能包含深度学习模型(如FaceNet或SSD),帮助机器人实现人脸的识别和跟踪,提升人机交互能力。 物体跟踪:物体跟踪使机器人能够持续关注并追踪特定目标。在ROS中,通常通过卡尔曼滤波器、粒子滤波器或光流法实现。robot_vision功能包可能包含这些算法的实现,助力机器人完成动态目标跟踪任务。 维码识别:维码是一种高效的信息编码方式,常用于机器人定位和导航。ROS中的维码包可用于读取和解析维码,而robot_vision可能进一步封装了这一功能,使其更易于集成到机器人系统中。 物体识别:作为机器视觉的高级应用,物体识别通常涉及深度学习模型,如YOLO、SSD或Faster R-CNN。robot_vision功能包可能包含预训练的模型和对应的ROS节点,使机器人能够识别环境中的特
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值