mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-09-27 03:25:56 +08:00
修复集群传输bug
This commit is contained in:
@@ -1 +1 @@
|
||||
#app,body,html{height:100%}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#184c18;position:relative}#app>div:first-child{position:absolute;top:10px;left:30px;font-size:x-large}.content{padding-top:60px}.feature-title[data-v-54efad41]{color:#eb5e46;font-weight:700;font-size:larger}p[data-v-54efad41]{margin:30px;font-size:20px}img[data-v-54efad41]{margin:20px}.root[data-v-e34eab40]{background:#d3d3d3}.root>img[data-v-e34eab40]{width:300px;margin:30px}.records[data-v-4eee1624]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 15px}.records>[data-v-4eee1624]{width:200px}.log-container{overflow-y:auto;max-height:500px}@-webkit-keyframes recording-data-v-f6113870{0%{opacity:.2}50%{opacity:1}to{opacity:.2}}@keyframes recording-data-v-f6113870{0%{opacity:.2}50%{opacity:1}to{opacity:.2}}.recording[data-v-f6113870]{-webkit-animation:recording-data-v-f6113870 1s infinite;animation:recording-data-v-f6113870 1s infinite}.layout[data-v-f6113870]{padding-bottom:30px;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.room[data-v-f6113870]{width:250px;margin:10px;text-align:left}.empty[data-v-f6113870]{color:#eb5e46;width:100%;min-height:500px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.empty[data-v-f6113870],.status[data-v-f6113870]{display:-webkit-box;display:-ms-flexbox;display:flex}.status[data-v-f6113870]{position:fixed;left:5px;bottom:10px}.status>div[data-v-f6113870]{margin:0 5px}
|
||||
#app,body,html{height:100%}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#184c18;position:relative}#app>div:first-child{position:absolute;top:10px;left:30px;font-size:x-large}.content{padding-top:60px}.feature-title[data-v-54efad41]{color:#eb5e46;font-weight:700;font-size:larger}p[data-v-54efad41]{margin:30px;font-size:20px}img[data-v-54efad41]{margin:20px}.root[data-v-e34eab40]{background:#d3d3d3}.root>img[data-v-e34eab40]{width:300px;margin:30px}.records[data-v-7d5ab110]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 15px}.records>[data-v-7d5ab110]{width:200px}.log-container{overflow-y:auto;max-height:500px}@-webkit-keyframes recording-data-v-65ac4b48{0%{opacity:.2}50%{opacity:1}to{opacity:.2}}@keyframes recording-data-v-65ac4b48{0%{opacity:.2}50%{opacity:1}to{opacity:.2}}.recording[data-v-65ac4b48]{-webkit-animation:recording-data-v-65ac4b48 1s infinite;animation:recording-data-v-65ac4b48 1s infinite}.layout[data-v-65ac4b48]{padding-bottom:30px;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.room[data-v-65ac4b48]{width:250px;margin:10px;text-align:left}.empty[data-v-65ac4b48]{color:#eb5e46;width:100%;min-height:500px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.empty[data-v-65ac4b48],.status[data-v-65ac4b48]{display:-webkit-box;display:-ms-flexbox;display:flex}.status[data-v-65ac4b48]{position:fixed;left:5px;bottom:10px}.status>div[data-v-65ac4b48]{margin:0 5px}
|
2
dashboard/dist/index.html
vendored
2
dashboard/dist/index.html
vendored
@@ -1 +1 @@
|
||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>Monibuca</title><script src=jessibuca/ajax.js></script><script src=jessibuca/renderer.js></script><link href=/css/app.ea4656d8.css rel=preload as=style><link href=/css/chunk-vendors.22ebf426.css rel=preload as=style><link href=/js/app.0267da57.js rel=preload as=script><link href=/js/chunk-vendors.ebc28a73.js rel=preload as=script><link href=/css/chunk-vendors.22ebf426.css rel=stylesheet><link href=/css/app.ea4656d8.css rel=stylesheet></head><body><noscript><strong>We're sorry but dashboard doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ebc28a73.js></script><script src=/js/app.0267da57.js></script></body></html>
|
||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>Monibuca</title><script src=jessibuca/ajax.js></script><script src=jessibuca/renderer.js></script><link href=/css/app.ce470878.css rel=preload as=style><link href=/css/chunk-vendors.22ebf426.css rel=preload as=style><link href=/js/app.017fb959.js rel=preload as=script><link href=/js/chunk-vendors.ebc28a73.js rel=preload as=script><link href=/css/chunk-vendors.22ebf426.css rel=stylesheet><link href=/css/app.ce470878.css rel=stylesheet></head><body><noscript><strong>We're sorry but dashboard doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ebc28a73.js></script><script src=/js/app.017fb959.js></script></body></html>
|
2
dashboard/dist/js/app.017fb959.js
vendored
Normal file
2
dashboard/dist/js/app.017fb959.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dashboard/dist/js/app.017fb959.js.map
vendored
Normal file
1
dashboard/dist/js/app.017fb959.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
2
dashboard/dist/js/app.0267da57.js
vendored
2
dashboard/dist/js/app.0267da57.js
vendored
File diff suppressed because one or more lines are too long
1
dashboard/dist/js/app.0267da57.js.map
vendored
1
dashboard/dist/js/app.0267da57.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<div>
|
||||
自动更新
|
||||
<i-switch v-model="autoUpdate"></i-switch>
|
||||
<div id="mountNode"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -7,24 +11,22 @@ import { mapState } from "vuex";
|
||||
import G6 from "@antv/g6";
|
||||
var graph = null;
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
autoUpdate: true
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
data(state) {
|
||||
let summary = state.summary;
|
||||
// 点集
|
||||
let nodes = [];
|
||||
// 边集
|
||||
let edges = [];
|
||||
this.addServer(summary, nodes, edges);
|
||||
return {
|
||||
nodes,
|
||||
edges
|
||||
};
|
||||
let d = this.addServer(state.summary);
|
||||
d.label = "🏠" + d.label;
|
||||
return d;
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
addServer(node, nodes, edges) {
|
||||
addServer(node) {
|
||||
let result = {
|
||||
id: node.Address,
|
||||
label: node.Address,
|
||||
@@ -33,61 +35,69 @@ export default {
|
||||
shape: "modelRect",
|
||||
logoIcon: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
children: []
|
||||
};
|
||||
nodes.push(result);
|
||||
|
||||
if (node.Rooms) {
|
||||
for (let i = 0; i < node.Rooms.length; i++) {
|
||||
let room = node.Rooms[i];
|
||||
let roomId = result.id + room.StreamPath;
|
||||
nodes.push({
|
||||
let roomId = room.StreamPath;
|
||||
let roomData = {
|
||||
id: roomId,
|
||||
label: room.StreamPath,
|
||||
shape: "rect"
|
||||
});
|
||||
edges.push({ source: result.id, target: roomId });
|
||||
shape: "rect",
|
||||
children: []
|
||||
};
|
||||
result.children.push(roomData);
|
||||
if (room.SubscriberInfo) {
|
||||
for (let j = 0; j < room.SubscriberInfo.length; j++) {
|
||||
let subId = roomId + room.SubscriberInfo[j].ID;
|
||||
nodes.push({
|
||||
roomData.children.push({
|
||||
id: subId,
|
||||
label: room.SubscriberInfo[j].ID
|
||||
});
|
||||
edges.push({ source: roomId, target: subId });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (node.Children) {
|
||||
for (let childId in node.Children) {
|
||||
this.addServer(node.Children[childId], nodes, edges);
|
||||
edges.push({
|
||||
source: result.id,
|
||||
target: childId
|
||||
});
|
||||
result.children.push(this.addServer(node.Children[childId]));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
data(v) {
|
||||
if (graph) {
|
||||
graph.read(v); // 加载数据
|
||||
if (graph && this.autoUpdate) {
|
||||
//graph.updateChild(v, "");
|
||||
graph.changeData(v); // 加载数据
|
||||
graph.fitView();
|
||||
//graph.read(v);
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
graph = new G6.Graph({
|
||||
renderer: "svg",
|
||||
graph = new G6.TreeGraph({
|
||||
linkCenter: true,
|
||||
// renderer: "svg",
|
||||
container: "mountNode", // 指定挂载容器
|
||||
width: 800, // 图的宽度
|
||||
height: 500, // 图的高度
|
||||
layout: {
|
||||
type: "radial"
|
||||
modes: {
|
||||
default: ["drag-canvas", "zoom-canvas", "click-select", "drag-node"]
|
||||
},
|
||||
defaultNode: {}
|
||||
animate: false,
|
||||
layout: {
|
||||
// type: "indeted",
|
||||
direction: "H"
|
||||
}
|
||||
});
|
||||
//graph.addChild(this.data, "");
|
||||
graph.read(this.data); // 加载数据
|
||||
graph.fitView();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
@@ -33,7 +33,7 @@ export default {
|
||||
x => {
|
||||
if (x == "success") {
|
||||
this.onVisible(true);
|
||||
this.$Message.success("删除成功");
|
||||
this.$Message.success("开始发布");
|
||||
} else {
|
||||
this.$Message.error(x);
|
||||
}
|
||||
@@ -50,7 +50,7 @@ export default {
|
||||
{ streamPath: item.Path.replace(".flv", "") },
|
||||
x => {
|
||||
if (x == "success") {
|
||||
this.$Message.success("开始发布");
|
||||
this.$Message.success("删除成功");
|
||||
} else {
|
||||
this.$Message.error(x);
|
||||
}
|
||||
|
@@ -118,6 +118,7 @@ export default {
|
||||
currentTab: "",
|
||||
currentStream: [],
|
||||
typeMap: {
|
||||
Receiver: "📡",
|
||||
FlvFile: "🎥",
|
||||
TS: "🎬",
|
||||
HLS: "🍎",
|
||||
|
@@ -3,12 +3,14 @@ package cluster
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
. "github.com/langhuihui/monibuca/monica"
|
||||
"github.com/langhuihui/monibuca/monica/avformat"
|
||||
"github.com/langhuihui/monibuca/monica/pool"
|
||||
"io"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Receiver struct {
|
||||
@@ -26,6 +28,7 @@ func (p *Receiver) Auth(authSub *OutputStream) {
|
||||
|
||||
func (p *Receiver) readAVPacket(avType byte) (av *pool.AVPacket, err error) {
|
||||
buf := pool.GetSlice(4)
|
||||
defer pool.RecycleSlice(buf)
|
||||
_, err = io.ReadFull(p, buf)
|
||||
if err != nil {
|
||||
println(err.Error())
|
||||
@@ -39,10 +42,7 @@ func (p *Receiver) readAVPacket(avType byte) (av *pool.AVPacket, err error) {
|
||||
}
|
||||
av.Payload = pool.GetSlice(int(binary.BigEndian.Uint32(buf)))
|
||||
_, err = io.ReadFull(p, av.Payload)
|
||||
if MayBeError(err) {
|
||||
return
|
||||
}
|
||||
pool.RecycleSlice(buf)
|
||||
MayBeError(err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ func PullUpStream(streamPath string) {
|
||||
}
|
||||
brw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
|
||||
p := &Receiver{
|
||||
Reader: conn,
|
||||
Reader: brw.Reader,
|
||||
Writer: brw.Writer,
|
||||
}
|
||||
if p.Publish(streamPath, p) {
|
||||
@@ -72,11 +72,7 @@ func PullUpStream(streamPath string) {
|
||||
return
|
||||
}
|
||||
defer p.Cancel()
|
||||
for {
|
||||
cmd, err := brw.ReadByte()
|
||||
if MayBeError(err) {
|
||||
return
|
||||
}
|
||||
for cmd, err := brw.ReadByte(); !MayBeError(err); cmd, err = brw.ReadByte() {
|
||||
switch cmd {
|
||||
case MSG_AUDIO:
|
||||
if audio, err := p.readAVPacket(avformat.FLV_TAG_TYPE_AUDIO); err == nil {
|
||||
@@ -103,6 +99,8 @@ func PullUpStream(streamPath string) {
|
||||
v.Cancel()
|
||||
}
|
||||
}
|
||||
default:
|
||||
log.Printf("unknown cmd:%v", cmd)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,12 +2,13 @@ package jessica
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gobwas/ws"
|
||||
. "github.com/langhuihui/monibuca/monica"
|
||||
"github.com/langhuihui/monibuca/monica/avformat"
|
||||
"github.com/langhuihui/monibuca/monica/pool"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func WsHandler(w http.ResponseWriter, r *http.Request) {
|
||||
|
12
slave.toml
12
slave.toml
@@ -1,11 +1,11 @@
|
||||
# [Plugins.HDL]
|
||||
# ListenAddr = ":2020"
|
||||
# [Plugins.Jessica]
|
||||
# ListenAddr = ":8080"
|
||||
# [Plugins.RTMP]
|
||||
# ListenAddr = ":1935"
|
||||
# [Plugins.GateWay]
|
||||
# ListenAddr = ":8081"
|
||||
[Plugins.Jessica]
|
||||
ListenAddr = ":8082"
|
||||
[Plugins.RTMP]
|
||||
ListenAddr = ":1936"
|
||||
[Plugins.GateWay]
|
||||
ListenAddr = ":8083"
|
||||
[Plugins.Cluster]
|
||||
Master = "localhost:2019"
|
||||
#ListenAddr = ":2019"
|
||||
|
Reference in New Issue
Block a user