java关于ffmpeg推流停止的问题

问题描述

Java程序中使用Runtime.getRuntime().exec()执行ffmpeg推流命令,大约五分钟后,推流停止,ffplay无法接收到流,但推流进程仍存在。

解决方法

process的阻塞:
在runtime执行大点的命令中,输入流和错误流会不断有流进入存储在JVM的缓冲区中,如果缓冲区的流不被读取被填满时,就会造成runtime的阻塞。所以在进行比如:大文件复制等的操作时,我们还需要不断的去读取JVM中的缓冲区的流,来防止Runtime的死锁阻塞。
利用单独两个线程,分别处理process的getInputStream()和getErrorSteam(),防止缓冲区被撑满,导致阻塞;

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

你可能感兴趣的:(java,ffmpeg)