添加日志

master
liuqingkun 3 years ago
parent d6ceae9cbc
commit e307dc9c0c
  1. 3
      src/main/java/cn/org/hentai/jtt1078/app/websocket/AbstractWebsocketClient.java
  2. 21
      src/main/java/cn/org/hentai/jtt1078/app/websocket/WebsocketClientHandler.java
  3. 2
      src/main/java/cn/org/hentai/jtt1078/publisher/PublishManager.java
  4. 1
      src/main/java/cn/org/hentai/jtt1078/server/Jtt1078Handler.java
  5. 14
      src/main/java/cn/org/hentai/jtt1078/subscriber/RTMPPublisher.java
  6. 61
      src/main/java/cn/org/hentai/jtt1078/test/AudioTest.java
  7. 9
      src/main/java/cn/org/hentai/jtt1078/util/BusinessConstant.java
  8. 2
      src/main/resources/app.properties

@ -1,5 +1,6 @@
package cn.org.hentai.jtt1078.app.websocket;
import cn.org.hentai.jtt1078.util.BusinessConstant;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import org.apache.commons.lang.StringUtils;
@ -54,7 +55,7 @@ public abstract class AbstractWebsocketClient implements Closeable {
doOpen();
doConnect();
} catch (Exception e) {
throw new MyException("连接没有成功打开,原因是:{}" + e.getMessage(), e);
log.error(BusinessConstant.LOGGER_PREFIX + " : wesocket连接没有成功打开,原因是:{}", e.getMessage(), e);
}
}

@ -9,13 +9,18 @@ import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.netty.util.CharsetUtil;
import net.sf.json.JSON;
import net.sf.json.JSONObject;
import net.sf.json.JSONString;
import net.sf.json.util.JSONUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
public class WebsocketClientHandler extends SimpleChannelInboundHandler<Object> {
@ -74,6 +79,7 @@ public class WebsocketClientHandler extends SimpleChannelInboundHandler<Object>
// 服务连接后, 启动定时发送数据的任务
if (reconnTimer != null) {
// 先关闭重连的定时任务
log.info(BusinessConstant.LOGGER_PREFIX + " : jt808服务websocket连接成功, 关闭重连的定时任务");
reconnTimer.cancel();
}
@ -85,7 +91,7 @@ public class WebsocketClientHandler extends SimpleChannelInboundHandler<Object>
String tag = PublishManager.getInstance().getCurPushDevice();
try {
WebsocketClient.getWsInstance().write(tag);
WebsocketClient.getWsInstance().write(BusinessConstant.WEBSOCKET_MSG_SOURCE_VALUE + ":" + tag);
// 每分钟的0s, 打印当前推流通道
LocalTime localTime = LocalTime.now();
@ -97,17 +103,6 @@ public class WebsocketClientHandler extends SimpleChannelInboundHandler<Object>
}
}
}, 10, 1000);
// printTimer = new Timer();
// log.info(BusinessConstant.LOGGER_PREFIX + " : jt808服务websocket连接成功, 启动打印当前通道定时任务");
// sendMsgTimer.schedule(new TimerTask() {
// @Override
// public void run() {
// String tag = PublishManager.getInstance().getCurPushDevice();
//
// log.info(BusinessConstant.LOGGER_PREFIX + " : jt808当前推流通道 : tag = {}", tag);
// }
// }, 10, 60000);
}
/**

@ -62,7 +62,7 @@ public final class PublishManager {
// 开启一个新的推流通道, 释放原来的通道
channels.values().forEach(channel -> {
channel.rtmpPublisher.close();
logger.info(BusinessConstant.LOGGER_PREFIX + " : 通道开启 : 调用close方法释放原来的通道");
close(channel.tag);
});
// 有新设备开启通道时, 清空下channels缓存

@ -131,6 +131,7 @@ public class Jtt1078Handler extends SimpleChannelInboundHandler<Packet> {
logger.info(BusinessConstant.LOGGER_PREFIX + " : release : tag = {} ", tag);
if (tag != null) {
logger.info("close netty channel: {}", tag);
logger.info(BusinessConstant.LOGGER_PREFIX + " : 关闭通道 : 调用close方法释放原来的通道");
PublishManager.getInstance().close(tag);
}
}

@ -36,17 +36,21 @@ public class RTMPPublisher extends Thread {
process = Runtime.getRuntime().exec(cmd);
stderr = process.getErrorStream();
String errMsg = "";
while ((len = stderr.read(buff)) > -1) {
if (debugMode) System.out.print(new String(buff, 0, len));
String str = new String(buff, 0, len);
errMsg += str;
if (debugMode) System.out.print(str);
}
logger.info(BusinessConstant.LOGGER_PREFIX + " : 执行ffmpeg命令失败, 关闭通道[{}] : Process FFMPEG exited... ", tag);
logger.info(BusinessConstant.LOGGER_PREFIX + " : 执行ffmpeg命令失败, 关闭通道[{}] : Process FFMPEG exited... : error msg = {} ", tag, errMsg);
// 若ffmpeg命令执行失败, 视为推流失败, 将通道从缓存中删除
logger.info(BusinessConstant.LOGGER_PREFIX + " : ffmpeg命令执行失败 : 调用close方法释放原来的通道");
PublishManager.getInstance().close(tag);
} catch (Exception ex) {
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布失败 : {} ", ex.getMessage());
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布失败, 关闭通道[{}]", tag);
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布异常 : {} ", ex.getMessage());
logger.info(BusinessConstant.LOGGER_PREFIX + " : 使用ffmpeg发布异常, 关闭通道[{}]", tag);
logger.info(BusinessConstant.LOGGER_PREFIX + " : ffmpeg命令异常 : 调用close方法释放原来的通道");
PublishManager.getInstance().close(tag);
}
}

@ -13,39 +13,32 @@ import java.io.FileOutputStream;
*/
public class AudioTest {
public static void main(String[] args) throws Exception {
String s1 = new String("");
String s2 = new String("");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
// int len = -1;
// byte[] block = new byte[1024];
// FileInputStream fis = new FileInputStream("e:\\test\\streaming.hex");
// Jtt1078Decoder decoder = new Jtt1078Decoder();
// G711Codec codec = new G711Codec();
// FileOutputStream fos = new FileOutputStream("e:\\test\\fuckfuckfuck1111.pcm");
// while ((len = fis.read(block)) > -1)
// {
// decoder.write(block, 0, len);
// while (true)
// {
// Packet p = decoder.decode();
// if (p == null) break;
//
// int lengthOffset = 28;
// int dataType = (p.seek(15).nextByte() >> 4) & 0x0f;
// // 透传数据类型:0100,没有后面的时间以及Last I Frame Interval和Last Frame Interval字段
// if (dataType == 0x04) lengthOffset = 28 - 8 - 2 - 2;
// else if (dataType == 0x03) lengthOffset = 28 - 4;
//
// if (dataType == 0x03)
// {
// byte[] pcmData = codec.toPCM(p.seek(lengthOffset + 2).nextBytes());
// fos.write(pcmData);
// fos.flush();
// }
// }
// }
// fos.close();
// fis.close();
int len = -1;
byte[] block = new byte[1024];
FileInputStream fis = new FileInputStream("e:\\test\\streaming.hex");
Jtt1078Decoder decoder = new Jtt1078Decoder();
G711Codec codec = new G711Codec();
FileOutputStream fos = new FileOutputStream("e:\\test\\fuckfuckfuck1111.pcm");
while ((len = fis.read(block)) > -1) {
decoder.write(block, 0, len);
while (true) {
Packet p = decoder.decode();
if (p == null) break;
int lengthOffset = 28;
int dataType = (p.seek(15).nextByte() >> 4) & 0x0f;
// 透传数据类型:0100,没有后面的时间以及Last I Frame Interval和Last Frame Interval字段
if (dataType == 0x04) lengthOffset = 28 - 8 - 2 - 2;
else if (dataType == 0x03) lengthOffset = 28 - 4;
if (dataType == 0x03) {
byte[] pcmData = codec.toPCM(p.seek(lengthOffset + 2).nextBytes());
fos.write(pcmData);
fos.flush();
}
}
}
fos.close();
fis.close();
}
}

@ -1,5 +1,12 @@
package cn.org.hentai.jtt1078.util;
import java.util.Map;
public interface BusinessConstant {
String LOGGER_PREFIX = " --- custom log --- ";
String LOGGER_PREFIX = " --- custom log --- ";
/**
* 发送给jt808的信息类型
*/
String WEBSOCKET_MSG_SOURCE_VALUE = "jtt1078";
}

@ -20,4 +20,4 @@ rtmp.url = rtmp://127.0.0.1:1935/live
#rtmp.url = rtmp://111583.livepush.myqcloud.com/trtc_1400439699/live_2042508984163242532?txSecret=78986d90bfaec1030442f0f1135646c9&txTime=642696EF
# 设置为on时,控制台将输出ffmpeg的输出
debug.mode = off
debug.mode = on
Loading…
Cancel
Save