首页新闻找找看学习计划

java在控制台输出打印cmd命令

0
悬赏园豆:10 [已解决问题] 解决于 2018-03-22 13:45

我在做ffmpeg命令转码,需要使用java来将执行cmd命令,但是将命令行写入之后,运行程序无反应,希望各位做过的提点意见,帮忙指正一些,谢谢。

问题补充:
 1 String all = "cmd /k ffmpeg -re -i \"rtsp://admin:123456@192.168.2.165:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif\" "
 2                 + "-f flv -r 2 -an -s 640*480 \"rtmp://127.0.0.1:1935/hls/mystream\"";
 3         String line =null;
 4         StringBuilder sb = new StringBuilder();
 5         Runtime runtime = Runtime.getRuntime();
 6         try {
 7             System.out.println(all);
 8             java.lang.Process process = runtime.exec("cmd /k dir");
 9             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
10             while((line = bufferedReader.readLine())!= null){
11                 sb.append(line + "\n");
12                 System.out.println(line);
13             }
14         } catch (IOException e) {
15             // TODO Auto-generated catch block
16             e.printStackTrace();
17         }
View Code
大漠飞鱼的主页 大漠飞鱼 | 初学一级 | 园豆:86
提问于:2018-03-09 10:38

这是源代码,没找出哪里有错误来啊

大漠飞鱼 1年前
< >
分享
最佳答案
0

可以输出些日志看命令行是否正常执行了

java中启动命令行建议使用这个 https://github.com/zeroturnaround/zt-exec  ,封装的很完善

收获园豆:10
2012 | 专家六级 |园豆:18892 | 2018-03-09 10:49

这个怎么用啊,直接放到项目中就可以运行么

大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-09 10:53

@大漠飞鱼: 参看其sample的例子,各种使用方式都有。工程只要引用这个jar就行

2012 | 园豆:18892 (专家六级) | 2018-03-10 08:33
其他回答(2)
0

相同代码运行正常,应该不是代码的问题

流年飞雨 | 园豆:1923 (小虾三级) | 2018-03-10 22:55

这一个可以执行,上面那一个转码的命令不可以执行

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-12 09:04

@大漠飞鱼: 那你启动cmd在相同的目录下执行上面转码命令可以吗?

支持(0) 反对(0) 流年飞雨 | 园豆:1923 (小虾三级) | 2018-03-12 16:52

@一座城你说你不懂: 我在cmd中执行的时候,就是没有进入相应的目录,直接在C盘下就可以,所以这个不需要的

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-12 16:53
0

呵呵,刚刚解决这个问题。

是不是发现cmd不能执行啊?和我碰到的一样,你在做HLS直播,我刚好做完点播,碰到和你一样的问题。

解决方法很简单,需要在cmd中加上start命令才行。

cmd /c start ffmpeg -i 1.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 5 -hls_list_size 0 -hls_wrap 0 -hls_key_info_file key_info 1.m3u8

yhdino | 园豆:701 (小虾三级) | 2018-03-22 17:18

加上一个start就可以了,会在控制台显示转码的过程么

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:20

执行完这条命令,还是会打开cme窗口,在窗口中转码啊,方便加一下QQ,请教几个问题么

1307329425

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:24

错别字,是CMD

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:24

@大漠飞鱼: 会的,会在控制台上显示,你也可以通过代码接收他的输出。

支持(0) 反对(0) yhdino | 园豆:701 (小虾三级) | 2018-03-22 17:25

@yhdino: 我写了打印到控制台的,但是这个打印不了,方便加QQ么,给你看一下代码

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:32

@大漠飞鱼: 不好意思,现在看明白了,你希望在自己的调试控制台上显示是吗?

这样我想是不行的,因为毕竟你已经把程序控制权限交由ffmpeg程序控制了,你已经不能在控制他,不过你可以在代码中监听输出,然后自己在自己的控制台上输出。以此达到你的目的。

另外不好意思,我不用QQ,如果有什么想法,可以给我留言。

支持(0) 反对(0) yhdino | 园豆:701 (小虾三级) | 2018-03-22 17:33

@yhdino: 好的,谢谢,这是我的代码截图

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:35

@yhdino: 请问你的有延迟么,大约延迟多少秒,怎样能够降低延迟

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-22 17:54

@大漠飞鱼: 不好意思,我正在试代码,现在还不能答复,目前还没有进展,如果有进展我会回复你。另外,我没有做过HLS的直播,从我角度来看,延迟是很正常的。我也是刚弄没多久,还在摸索中。

支持(0) 反对(0) yhdino | 园豆:701 (小虾三级) | 2018-03-22 18:15

@yhdino: 嗯,好,我现在通过ffmpeg转码之后,延迟接近30秒,而且稳定性不是很好

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-23 15:08

@yhdino: 我的已经解决了,加上start之后,会打开cmd窗口,在里面执行命令,如果不加start呢,就要把程序写到线程中,在线程中执行,就可以实现了,但是不会将转码的过程打印出出来;还有延迟是因为-an,去掉这个-an就好了,现在只是画面模糊,不稳定了

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-23 15:51

@大漠飞鱼: 昨天晚上没有试出结果,如果我的理解没有错误,process本身就是线程执行,问题在于cmd start是由cmd命令打开了新的窗口,所以java无法获取输出流,也就无法在控制台上打印结果。你的代码是没有问题的。另外如果不想打开新的窗口,让它后台执行可以使用cmd start /b就可以了,这样不开新窗口,转码也可以执行。

关于延迟的问题,我是这么理解的,HLS顾名思义就是利用http的方式传送数据,简单说就是将视屏切成了好多片段,然后再playlist中循环播放,所以后台需要不停的重写文件1,文件2.。。。所以我的觉得有比较大的延时,应该是正常的。

另外HLS我也只摸了两周,目前主要是在微信中做视屏加密点播功能,所以也不太熟。共同学习

支持(0) 反对(0) yhdino | 园豆:701 (小虾三级) | 2018-03-23 23:07

@yhdino:我用线程执行的,也可以,用process来执行cmd /b start ...就不可以,运行程序之后,接着就死掉了

支持(0) 反对(0) 大漠飞鱼 | 园豆:86 (初学一级) | 2018-03-26 10:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册