问题描述
Java程序中使用Runtime.getRuntime().exec()执行ffmpeg推流命令,大约五分钟后,推流停止,ffplay无法接收到流,但推流进程仍存在。
解决方法
process的阻塞:
在runtime执行大点的命令中,输入流和错误流会不断有流进入存储在JVM的缓冲区中,如果缓冲区的流不被读取被填满时,就会造成runtime的阻塞。所以在进行比如:大文件复制等的操作时,我们还需要不断的去读取JVM中的缓冲区的流,来防止Runtime的死锁阻塞。
利用单独两个线程,分别处理process的getInputStream()和getErrorSteam(),防止缓冲区被撑满,导致阻塞;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class DealProcessStream extends Thread {<!-- --> private InputStream inputStream; public DealProcessStream(InputStream inputStream) {<!-- --> this.inputStream = inputStream; } public void run() {<!-- --> InputStreamReader inputStreamReader = null; BufferedReader br = null; try {<!-- --> inputStreamReader = new InputStreamReader( inputStream); br = new BufferedReader(inputStreamReader); // 打印信息 // String line = null; // while ((line = br.readLine()) != null) {<!-- --> // System.out.println(line); // } // 不打印信息 while (br.readLine() != null); } catch (IOException ioe) {<!-- --> ioe.printStackTrace(); }finally {<!-- --> try {<!-- --> br.close(); inputStreamReader.close(); } catch (IOException e) {<!-- --> e.printStackTrace(); } } } } |
参考文章
https://www.cnblogs.com/tohxyblog/p/6501396.html
https://www.cnblogs.com/MacrossFT/p/12038479.html