|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package cn.org.hentai.jtt1078.subscriber; |
|
|
|
|
|
|
|
|
|
import cn.org.hentai.jtt1078.publisher.PublishManager; |
|
|
|
|
import cn.org.hentai.jtt1078.server.SessionManager; |
|
|
|
|
import cn.org.hentai.jtt1078.util.*; |
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
@ -11,6 +12,8 @@ public class RTMPPublisher extends Thread { |
|
|
|
|
static Logger logger = LoggerFactory.getLogger(RTMPPublisher.class); |
|
|
|
|
|
|
|
|
|
String tag = null; |
|
|
|
|
// 主动退出标志
|
|
|
|
|
boolean closeFlag = false; |
|
|
|
|
Process process = null; |
|
|
|
|
|
|
|
|
|
public RTMPPublisher(String tag) { |
|
|
|
|
@ -34,6 +37,14 @@ public class RTMPPublisher extends Thread { |
|
|
|
|
); |
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : 执行ffmpeg命令 : {} ", cmd); |
|
|
|
|
process = Runtime.getRuntime().exec(cmd); |
|
|
|
|
|
|
|
|
|
if (!closeFlag) { |
|
|
|
|
// 若ffmpeg主动退出标志为否, 重新执行一次ffmpeg命令
|
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : 执行ffmpeg命令失败 - 进行重试 : {} ", cmd); |
|
|
|
|
closeFlag = Boolean.FALSE; |
|
|
|
|
process = Runtime.getRuntime().exec(cmd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
stderr = process.getErrorStream(); |
|
|
|
|
|
|
|
|
|
String errMsg = ""; |
|
|
|
|
@ -44,12 +55,14 @@ public class RTMPPublisher extends Thread { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : 执行ffmpeg命令失败, 关闭通道[{}], 并调用close方法释放原来的通道 : Process FFMPEG exited... : error msg = {} ", tag, errMsg); |
|
|
|
|
// 若ffmpeg命令执行失败, 视为推流失败, 将通道从缓存中删除
|
|
|
|
|
PublishManager.getInstance().close(tag); |
|
|
|
|
} catch (Exception ex) { |
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布异常 : {} ", ex.getMessage()); |
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布异常, 关闭通道[{}], 并调用close方法释放原来的通道", tag); |
|
|
|
|
} finally { |
|
|
|
|
// 若ffmpeg命令执行失败, 视为推流失败, 将通道从缓存中删除
|
|
|
|
|
PublishManager.getInstance().close(tag); |
|
|
|
|
// 同时需要将SessionManager中对应缓存删掉
|
|
|
|
|
SessionManager.clear(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -60,4 +73,13 @@ public class RTMPPublisher extends Thread { |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void close(Boolean flag) { |
|
|
|
|
try { |
|
|
|
|
closeFlag = flag; |
|
|
|
|
logger.info(BusinessConstant.LOGGER_PREFIX + " : ffmpeg close : ffmpeg线程关闭. tag = {}, closeFlag = {}", tag, flag); |
|
|
|
|
if (process != null) process.destroyForcibly(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |