我在做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 }
可以输出些日志看命令行是否正常执行了
java中启动命令行建议使用这个 https://github.com/zeroturnaround/zt-exec ,封装的很完善
这个怎么用啊,直接放到项目中就可以运行么
@大漠飞鱼: 参看其sample的例子,各种使用方式都有。工程只要引用这个jar就行
呵呵,刚刚解决这个问题。
是不是发现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
加上一个start就可以了,会在控制台显示转码的过程么
执行完这条命令,还是会打开cme窗口,在窗口中转码啊,方便加一下QQ,请教几个问题么
1307329425
错别字,是CMD
@大漠飞鱼: 会的,会在控制台上显示,你也可以通过代码接收他的输出。
@yhdino: 我写了打印到控制台的,但是这个打印不了,方便加QQ么,给你看一下代码
@大漠飞鱼: 不好意思,现在看明白了,你希望在自己的调试控制台上显示是吗?
这样我想是不行的,因为毕竟你已经把程序控制权限交由ffmpeg程序控制了,你已经不能在控制他,不过你可以在代码中监听输出,然后自己在自己的控制台上输出。以此达到你的目的。
另外不好意思,我不用QQ,如果有什么想法,可以给我留言。
@yhdino: 好的,谢谢,这是我的代码截图
@yhdino: 请问你的有延迟么,大约延迟多少秒,怎样能够降低延迟
@大漠飞鱼: 不好意思,我正在试代码,现在还不能答复,目前还没有进展,如果有进展我会回复你。另外,我没有做过HLS的直播,从我角度来看,延迟是很正常的。我也是刚弄没多久,还在摸索中。
@yhdino: 嗯,好,我现在通过ffmpeg转码之后,延迟接近30秒,而且稳定性不是很好
@yhdino: 我的已经解决了,加上start之后,会打开cmd窗口,在里面执行命令,如果不加start呢,就要把程序写到线程中,在线程中执行,就可以实现了,但是不会将转码的过程打印出出来;还有延迟是因为-an,去掉这个-an就好了,现在只是画面模糊,不稳定了
@大漠飞鱼: 昨天晚上没有试出结果,如果我的理解没有错误,process本身就是线程执行,问题在于cmd start是由cmd命令打开了新的窗口,所以java无法获取输出流,也就无法在控制台上打印结果。你的代码是没有问题的。另外如果不想打开新的窗口,让它后台执行可以使用cmd start /b就可以了,这样不开新窗口,转码也可以执行。
关于延迟的问题,我是这么理解的,HLS顾名思义就是利用http的方式传送数据,简单说就是将视屏切成了好多片段,然后再playlist中循环播放,所以后台需要不停的重写文件1,文件2.。。。所以我的觉得有比较大的延时,应该是正常的。
另外HLS我也只摸了两周,目前主要是在微信中做视屏加密点播功能,所以也不太熟。共同学习
@yhdino:我用线程执行的,也可以,用process来执行cmd /b start ...就不可以,运行程序之后,接着就死掉了
这是源代码,没找出哪里有错误来啊
– 大漠飞鱼 6年前