Compare commits

..

1 Commits

Author SHA1 Message Date
langhuihui
8a35f763dd 集群采集信息功能完善 2020-02-04 13:46:19 +08:00
14 changed files with 64 additions and 91 deletions

View File

@@ -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-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}
#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}

View File

@@ -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.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>
<!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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dashboard/dist/js/app.0267da57.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dashboard/dist/js/app.0267da57.js.map vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,5 @@
<template>
<div>
自动更新
<i-switch v-model="autoUpdate"></i-switch>
<div id="mountNode"></div>
</div>
<div id="mountNode"></div>
</template>
<script>
@@ -11,22 +7,24 @@ import { mapState } from "vuex";
import G6 from "@antv/g6";
var graph = null;
export default {
data() {
return {
autoUpdate: true
};
},
computed: {
...mapState({
data(state) {
let d = this.addServer(state.summary);
d.label = "🏠" + d.label;
return d;
let summary = state.summary;
// 点集
let nodes = [];
// 边集
let edges = [];
this.addServer(summary, nodes, edges);
return {
nodes,
edges
};
}
})
},
methods: {
addServer(node) {
addServer(node, nodes, edges) {
let result = {
id: node.Address,
label: node.Address,
@@ -35,69 +33,61 @@ 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 = room.StreamPath;
let roomData = {
let roomId = result.id + room.StreamPath;
nodes.push({
id: roomId,
label: room.StreamPath,
shape: "rect",
children: []
};
result.children.push(roomData);
shape: "rect"
});
edges.push({ source: result.id, target: roomId });
if (room.SubscriberInfo) {
for (let j = 0; j < room.SubscriberInfo.length; j++) {
let subId = roomId + room.SubscriberInfo[j].ID;
roomData.children.push({
nodes.push({
id: subId,
label: room.SubscriberInfo[j].ID
});
edges.push({ source: roomId, target: subId });
}
}
}
}
if (node.Children) {
for (let childId in node.Children) {
result.children.push(this.addServer(node.Children[childId]));
this.addServer(node.Children[childId], nodes, edges);
edges.push({
source: result.id,
target: childId
});
}
}
return result;
}
},
watch: {
data(v) {
if (graph && this.autoUpdate) {
//graph.updateChild(v, "");
graph.changeData(v); // 加载数据
graph.fitView();
//graph.read(v);
if (graph) {
graph.read(v); // 加载数据
}
}
},
mounted() {
graph = new G6.TreeGraph({
linkCenter: true,
// renderer: "svg",
graph = new G6.Graph({
renderer: "svg",
container: "mountNode", // 指定挂载容器
width: 800, // 图的宽度
height: 500, // 图的高度
modes: {
default: ["drag-canvas", "zoom-canvas", "click-select", "drag-node"]
},
animate: false,
layout: {
// type: "indeted",
direction: "H"
}
type: "radial"
},
defaultNode: {}
});
//graph.addChild(this.data, "");
graph.read(this.data); // 加载数据
graph.fitView();
}
};
</script>

View File

@@ -9,8 +9,6 @@
>
<canvas id="canvas" width="488" height="275" style="background: black" />
<div slot="footer">
音频缓冲
<InputNumber v-model="audioBuffer" size="small"></InputNumber>
<Button v-if="audioEnabled" @click="turnOff" icon="md-volume-off" />
<Button v-else @click="turnOn" icon="md-volume-up"></Button>
</div>
@@ -24,23 +22,18 @@ export default {
data() {
return {
audioEnabled: false,
audioBuffer: 12,
url: ""
};
},
watch: {
audioEnabled(value) {
h5lc.audioEnabled(value);
},
audioBuffer(v) {
h5lc.audioBuffer = v;
}
},
mounted() {
h5lc = new window.Jessibuca({
canvas: document.getElementById("canvas"),
decoder: "jessibuca/ff.js",
audioBuffer: this.audioBuffer
decoder: "jessibuca/ff.js"
});
},
destroyed() {

View File

@@ -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);
}

View File

@@ -118,7 +118,6 @@ export default {
currentTab: "",
currentStream: [],
typeMap: {
Receiver: "📡",
FlvFile: "🎥",
TS: "🎬",
HLS: "🍎",

View File

@@ -2,12 +2,11 @@ package monica
import (
"context"
"github.com/langhuihui/monibuca/monica/avformat"
"github.com/langhuihui/monibuca/monica/pool"
"log"
"sync"
"time"
"github.com/langhuihui/monibuca/monica/avformat"
"github.com/langhuihui/monibuca/monica/pool"
)
var (
@@ -155,17 +154,11 @@ func (r *Room) Run() {
}
}
func (r *Room) PushAudio(audio *pool.AVPacket) {
if len(audio.Payload) < 3 {
return
}
if audio.Payload[0] == 0xFF && (audio.Payload[1]&0xF0) == 0xF0 {
audio.IsADTS = true
r.AudioTag = audio
} else if r.AudioTag == nil {
audio.IsAACSequence = true
if len(audio.Payload) < 5 {
return
}
r.AudioTag = audio
tmp := audio.Payload[0] // 第一个字节保存着音频的相关信息
if r.AudioInfo.SoundFormat = tmp >> 4; r.AudioInfo.SoundFormat == 10 { //真的是AAC的话后面有一个字节的详细信息
@@ -207,9 +200,6 @@ func (r *Room) setH264Info(video *pool.AVPacket) {
}
}
func (r *Room) PushVideo(video *pool.AVPacket) {
if len(video.Payload) < 3 {
return
}
video.VideoFrameType = video.Payload[0] >> 4 // 帧类型 4Bit, H264一般为1或者2
r.VideoInfo.CodecID = video.Payload[0] & 0x0f // 编码类型ID 4Bit, JPEG, H263, AVC...
video.IsAVCSequence = video.VideoFrameType == 1 && video.Payload[1] == 0

View File

@@ -3,14 +3,12 @@ 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 {
@@ -28,7 +26,6 @@ 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())
@@ -42,7 +39,10 @@ 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)
MayBeError(err)
if MayBeError(err) {
return
}
pool.RecycleSlice(buf)
return
}
@@ -57,7 +57,7 @@ func PullUpStream(streamPath string) {
}
brw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
p := &Receiver{
Reader: brw.Reader,
Reader: conn,
Writer: brw.Writer,
}
if p.Publish(streamPath, p) {
@@ -72,7 +72,11 @@ func PullUpStream(streamPath string) {
return
}
defer p.Cancel()
for cmd, err := brw.ReadByte(); !MayBeError(err); cmd, err = brw.ReadByte() {
for {
cmd, err := brw.ReadByte()
if MayBeError(err) {
return
}
switch cmd {
case MSG_AUDIO:
if audio, err := p.readAVPacket(avformat.FLV_TAG_TYPE_AUDIO); err == nil {
@@ -99,8 +103,6 @@ func PullUpStream(streamPath string) {
v.Cancel()
}
}
default:
log.Printf("unknown cmd:%v", cmd)
}
}
}

View File

@@ -2,13 +2,12 @@ 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) {

View File

@@ -1,11 +1,11 @@
# [Plugins.HDL]
# ListenAddr = ":2020"
[Plugins.Jessica]
ListenAddr = ":8082"
[Plugins.RTMP]
ListenAddr = ":1936"
[Plugins.GateWay]
ListenAddr = ":8083"
# [Plugins.Jessica]
# ListenAddr = ":8080"
# [Plugins.RTMP]
# ListenAddr = ":1935"
# [Plugins.GateWay]
# ListenAddr = ":8081"
[Plugins.Cluster]
Master = "localhost:2019"
#ListenAddr = ":2019"