在使用ffmpeg推流过程中,几分钟或者十几分钟后时间不固定,会断掉报错av_interleaved_write_frame(): Broken pipe。流媒体服务器用的是srs,部署在Linux系统。
报错的日志:
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
检查一下网络是否问题,服务器配置是否满足推流要求