diff --git a/dc3-service/dc3-rtmp/.gitignore b/dc3-service/dc3-rtmp/.gitignore
new file mode 100644
index 000000000..15dbad4a3
--- /dev/null
+++ b/dc3-service/dc3-rtmp/.gitignore
@@ -0,0 +1,7 @@
+target/
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
\ No newline at end of file
diff --git a/dc3-service/dc3-rtmp/pom.xml b/dc3-service/dc3-rtmp/pom.xml
new file mode 100644
index 000000000..f9bc22ebd
--- /dev/null
+++ b/dc3-service/dc3-rtmp/pom.xml
@@ -0,0 +1,32 @@
+
+
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description: + */ +@EnableAsync +@EnableFeignClients +@EnableEurekaClient +@SpringBootApplication +public class RtmpApplication { + public static void main(String[] args) { + SpringApplication.run(RtmpApplication.class, args); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java new file mode 100644 index 000000000..208c053a4 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java @@ -0,0 +1,13 @@ +package com.pnoker.rtsp.bean; + +import java.util.concurrent.LinkedBlockingQueue; + +/** + *
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description: 指令任务实体类,用于存放队列信息 + */ +public class CommandTask { + public static LinkedBlockingQueue taskQueue = new LinkedBlockingQueue(20); +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java new file mode 100644 index 000000000..6f2a65f8d --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java @@ -0,0 +1,32 @@ +package com.pnoker.rtsp.bean; + +import com.pnoker.rtsp.handle.OutputHandle; +import lombok.Data; + +import java.io.IOException; + +/** + *
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description: 任务描述实体类 + */ +@Data +public class Tasker { + private String id; + private String command; + private Process process; + private OutputHandle outputHandle; + + public Tasker(String id, String command) { + this.id = id; + this.command = command; + } + + public void start() throws IOException { + Runtime runtime = Runtime.getRuntime(); + this.process = runtime.exec(this.command); + this.outputHandle = new OutputHandle(this.process); + new Thread(this.outputHandle).start(); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java new file mode 100644 index 000000000..ae2067758 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java @@ -0,0 +1,53 @@ +package com.pnoker.rtsp.command; + + +import lombok.Data; + +/** + *
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description: + */ +@Data +public class CommandBuilder { + private String cmd; + private StringBuilder stringBuilder; + + public CommandBuilder(String path) { + this.stringBuilder = new StringBuilder(path); + } + + public CommandBuilder create(String exe) { + if (null != stringBuilder) { + stringBuilder.append(exe); + } + return this; + } + + public CommandBuilder add(String cmd) { + if (null != stringBuilder) { + stringBuilder.append(" " + cmd); + } + return this; + } + + public CommandBuilder add(String key, String cmd) { + return add(key).add(cmd); + } + + public void build() { + cmd = stringBuilder.toString(); + } + + public static void main(String[] args) { + CommandBuilder builder = new CommandBuilder("D:/Documents/FFmpeg/bin/"); + builder.create("ffmpeg") + .add("-i", "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-f", "flv") + .add("-y", "rtmp://106.14.182.20:1935/rtmp/tomcat").build(); + System.out.println(builder.getCmd()); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java new file mode 100644 index 000000000..576e8f218 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java @@ -0,0 +1,65 @@ +package com.pnoker.rtsp.handle; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + *
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description: Process输出处理线程 + */ +@Slf4j +@Data +public class OutputHandle implements Runnable { + /** + * 运行状态,false:运行失败 + */ + private volatile boolean status = true; + private Process process; + + public OutputHandle(Process process) { + this.process = process; + } + + @Override + public void run() { + if (status) { + read(process.getErrorStream()); + } + } + + public void read(InputStream inputStream) { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + try { + if (!status) { + throw new IOException(); + } + while (null != (line = reader.readLine())) { + handle(line); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + try { + inputStream.close(); + process.destroyForcibly(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + + public void handle(String message) { + message = message.toLowerCase(); + if (message.contains("fail") || message.contains("miss")) { + this.status = false; + } + } +} diff --git a/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml b/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml new file mode 100644 index 000000000..2e08fd973 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 8806 + undertow: + worker-threads: 20 + buffer-size: 512 + io-threads: 2 + +feign: + hystrix: + enabled: true + +logging: + file: dc3/logs/dc3-rtmp-dev.log + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8800/eureka/ diff --git a/dc3-service/dc3-rtmp/src/main/resources/application-product.yml b/dc3-service/dc3-rtmp/src/main/resources/application-product.yml new file mode 100644 index 000000000..ce7018ce3 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application-product.yml @@ -0,0 +1,18 @@ +server: + port: 8806 + undertow: + worker-threads: 20 + buffer-size: 512 + io-threads: 2 + +feign: + hystrix: + enabled: true + +logging: + file: dc3/logs/dc3-rtmp-product.log + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8800/eureka/,http://localhost:8801/eureka/ \ No newline at end of file diff --git a/dc3-service/dc3-rtmp/src/main/resources/application.yml b/dc3-service/dc3-rtmp/src/main/resources/application.yml new file mode 100644 index 000000000..7f17088a0 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: dc3-service-rtsp-rtmp + profiles: + active: dev \ No newline at end of file diff --git a/dc3-service/dc3-rtmp/src/main/resources/banner.txt b/dc3-service/dc3-rtmp/src/main/resources/banner.txt new file mode 100644 index 000000000..6f7986792 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + +${AnsiColor.BRIGHT_CYAN}Spring Boot${spring-boot.formatted-version}${AnsiColor.BRIGHT_RED} + .___ ________ .__ __ .__ __ _____ + __| _/____ \_____ \ |__| _____/ |_ ______ | | _____ _/ |__/ ____\___________ _____ + / __ |/ ___\ _(__ < | |/ _ \ __\ \____ \| | \__ \\ __\ __\/ _ \_ __ \/ \ +/ /_/ \ \___ / \ | ( <_> ) | | |_> > |__/ __ \| | | | ( <_> ) | \/ Y Y \ +\____ |\___ >______ / |__|\____/|__| | __/|____(____ /__| |__| \____/|__| |__|_| / + \/ \/ \/ |__| \/ \/ +${AnsiColor.BRIGHT_CYAN}Copyright c 2018-2020 The ${AnsiColor.BRIGHT_YELLOW}Pnoker${AnsiColor.BRIGHT_CYAN} Authors diff --git a/dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico b/dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico new file mode 100644 index 000000000..a3d4060b7 Binary files /dev/null and b/dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico differ diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java new file mode 100644 index 000000000..4493ac0ed --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java @@ -0,0 +1,79 @@ +package com.pnoker.socket.client; + +import com.pnoker.socket.handler.ClientHandler; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.AttributeKey; +import io.netty.util.CharsetUtil; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetSocketAddress; + +/** + *
Copyright(c) 2018. Pnoker All Rights Reserved. + *
Author : Pnoker + *
Email : pnokers@gmail.com + *
Description:
+ */
+@Slf4j
+public class NettyClient {
+
+
+ private static Bootstrap b;
+ private static ChannelFuture f;
+ private static final EventLoopGroup workerGroup = new NioEventLoopGroup();
+
+ private static void init() {
+ try {
+ log.info("init...");
+ b = new Bootstrap();
+ b.group(workerGroup);
+ b.channel(NioSocketChannel.class);
+ b.option(ChannelOption.SO_KEEPALIVE, true);
+ b.handler(new ChannelInitializer Copyright(c) 2018. Pnoker All Rights Reserved.
+ * Author : Pnoker
+ * Email : pnokers@gmail.com
+ * Description:
+ */
+public class ClientHandler extends SimpleChannelInboundHandler