在使用ffmpeg推流过程中,几分钟或者十几分钟后时间不固定,会断掉报错av_interleaved_write_frame(): Broken pipe。

在使用ffmpeg推流过程中,几分钟或者十几分钟后时间不固定,会断掉报错av_interleaved_write_frame(): Broken pipe。流媒体服务器用的是srs,部署在Linux系统。

报错的日志:

img

Java代码:

 @Async("taskExecutor")
    public void plugFlow(String rtspUrl,String myStream) {
        Logger log = LoggerFactory.getLogger(MonitorVideo.class);
        BufferedReader br = null;
        try {
            String basePath = "/usr/local/ffmpeg/bin/ffmpeg ";
            String command = basePath +
                    "-i " + rtspUrl +" "+
                    "-c copy -f flv " +
                    "rtmp://127.0.0.1/live/"+myStream;
            log.info("【command】:{}",command);
            log.info("rtmp://127.0.0.1/live/"+myStream);
            Process process = Runtime.getRuntime().exec(command);
            br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                log.info("视频推流信息{}", line);
            }
        } catch (Exception e) {
            log.error("ffmpeg推流失败:",e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    log.error("RequestUtil,IOException:",e);
                }
            }
        }
    }

Java程序中使用Runtime.getRuntime().exec()推FFmpeg流的话,输入流和错误流会不断有流进入存储在JVM的缓冲区中,如果缓冲区的流不被读取被填满时,就会造成runtime的阻塞。解决方法就是单独两个线程,分别处理process的getInputStream()和getErrorSteam(),防止缓冲区被撑满,导致阻塞。
具体的代码,你可以参考下这个:https://www.codenong.com/cs109200577/

https://blog.csdn.net/qq_23282479/article/details/107579597

使用这个试试

@echo off  
set INTERVAL=60 
:Again  
echo start server
**推流命令**
timeout %INTERVAL%
goto Again


检查一下网络是否问题,服务器配置是否满足推流要求