t.summary.Rooms||[],Memory:t=>t.summary.Memory,CPUUsage:t=>t.summary.CPUUsage,HardDisk:t=>t.summary.HardDisk,cpuStatus:t=>t.summary.CPUUsage>99?"error":t.summary.CPUUsage>50?"warning":"success",memoryStatus(t){return t.summary.CPUUsage>99?"error":t.summary.CPUUsage>50?"warning":"success"},hardDiskStatus(t){return t.summary.CPUUsage>99?"error":t.summary.CPUUsage>50?"warning":"success"},totalInNetSpeed(t){return this.networkFormat(t.summary.NetWork.reduce((t,e)=>t+e.ReceiveSpeed,0))+"/S"},totalOutNetSpeed(t){return this.networkFormat(t.summary.NetWork.reduce((t,e)=>t+e.SentSpeed,0))+"/S"}})},methods:{...Object(_["b"])(["fetchSummary","stopFetchSummary"]),preview(t){this.$refs.jessibuca.play("ws://"+location.hostname+":8080/"+t.StreamPath),this.showPreview=!0},onShowDetail(){},networkFormat(t,e=""){return t>1024&&D[e]?this.networkFormat(t/1024,D[e]):t.toFixed(2).replace(".00","")+e+"B"},SoundFormat(t){return H[t]},CodecID(t){return G[t]},SoundRate(t){return t>1e3?t/1e3+"kHz":t+"Hz"},record(t){window.ajax.get("//"+location.host+"/api/record/flv",{streamPath:t.StreamPath},t=>{"success"==t?this.$Message.success("开始录制"):this.$Message.error(t)})},stopRecord(t){window.ajax.get("//"+location.host+"/api/record/flv/stop",{streamPath:t.StreamPath},t=>{"success"==t?this.$Message.success("停止录制"):this.$Message.error(t)})},isRecording(t){return t.SubscriberInfo&&t.SubscriberInfo.find(t=>"FlvRecord"==t.Type)}},mounted(){this.fetchSummary()},destroyed(){this.stopFetchSummary()}},B=R,A=(a("f708"),Object(u["a"])(B,b,y,!1,null,"c2fdc660",null)),$=A.exports;r["default"].use(m["a"]);const E=[{path:"/",name:"home",component:d["default"]},{path:"/about",name:"about",component:g},{path:"/console",name:"console",component:$}],N=new m["a"]({mode:"history",base:"/",routes:E});var J=N;r["default"].use(_["a"]);let z=null;var L=new _["a"].Store({state:{summary:{NetWork:[],Rooms:[],Memory:{Used:0,Usage:0},CPUUsage:0,HardDisk:{Used:0,Usage:0}}},mutations:{update(t,e){Object.assign(t,e)}},actions:{fetchSummary({commit:t}){z=new EventSource("//"+location.host+"/api/summary"),z.onmessage=e=>{if(!e.data)return;let a=JSON.parse(e.data);t("update",{summary:a})}},stopFetchSummary(){z.close()}},modules:{}}),V=a("f825"),W=a.n(V);a("f8ce");r["default"].use(W.a),r["default"].config.productionTip=!1,new r["default"]({router:J,store:L,render:t=>t(l)}).$mount("#app")},5775:function(t,e,a){"use strict";var r=a("f706"),n=a.n(r);n.a},"7ad4":function(t,e,a){"use strict";var r=a("0c3e"),n=a.n(r);e["default"]=n.a},"7c5e":function(t,e,a){},"850a":function(t,e,a){"use strict";var r=a("7c5e"),n=a.n(r);n.a},bb51:function(t,e,a){"use strict";var r=a("470c"),n=a("7ad4"),o=(a("850a"),a("2877")),s=Object(o["a"])(n["default"],r["a"],r["b"],!1,null,"54efad41",null);e["default"]=s.exports},cf05:function(t,e,a){t.exports=a.p+"img/logo.b5357057.png"},e660:function(t,e,a){t.exports=a.p+"img/wechat.ff453262.jpg"},f195:function(t,e,a){},f706:function(t,e,a){},f708:function(t,e,a){"use strict";var r=a("262d"),n=a.n(r);n.a}});
+//# sourceMappingURL=app.d106a496.js.map
\ No newline at end of file
diff --git a/dashboard/dist/js/app.d106a496.js.map b/dashboard/dist/js/app.d106a496.js.map
new file mode 100644
index 0000000..8616f7b
--- /dev/null
+++ b/dashboard/dist/js/app.d106a496.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?7139","webpack:///./src/assets/alipay.png","webpack:///./src/views/Home.vue?92b9","webpack:///./src/views/Home.vue?45bf","webpack:///./src/App.vue?a8a9","webpack:///src/App.vue","webpack:///./src/App.vue?1a79","webpack:///./src/App.vue?42b4","webpack:///./src/views/About.vue?4063","webpack:///./src/views/About.vue?890d","webpack:///./src/views/Console.vue?7c46","webpack:///./src/components/Jessibuca.vue?1782","webpack:///src/components/Jessibuca.vue","webpack:///./src/components/Jessibuca.vue?b76e","webpack:///./src/components/Jessibuca.vue","webpack:///./src/components/StartTime.vue?0403","webpack:///src/components/StartTime.vue","webpack:///./src/components/StartTime.vue?eb9e","webpack:///./src/components/StartTime.vue","webpack:///src/views/Console.vue","webpack:///./src/views/Console.vue?2ccf","webpack:///./src/views/Console.vue?8615","webpack:///./src/router/index.js","webpack:///./src/store/index.js","webpack:///./src/plugins/iview.js","webpack:///./src/main.js","webpack:///./src/views/About.vue?c42f","webpack:///./src/views/Home.vue?126c","webpack:///./src/views/Home.vue?274a","webpack:///./src/views/Home.vue?3062","webpack:///./src/assets/logo.png","webpack:///./src/assets/wechat.jpg","webpack:///./src/views/Console.vue?ef4a"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","attrs","_v","staticStyle","staticClass","slot","staticRenderFns","selectedMenu","component","_m","script","_l","item","StreamPath","_s","typeMap","Type","StartTime","SoundFormat","AudioInfo","PacketCount","SoundRate","SoundType","CodecID","VideoInfo","SPSInfo","Width","Height","on","$event","onShowDetail","SubscriberInfo","preview","_e","isRecording","stopRecord","record","Rooms","totalInNetSpeed","totalOutNetSpeed","memoryStatus","networkFormat","Memory","Used","Usage","toFixed","cpuStatus","CPUUsage","hardDiskStatus","HardDisk","ref","model","callback","$$v","showPreview","expression","_g","_b","url","onClosePreview","$attrs","$listeners","Date","toLocaleString","Vue","use","VueRouter","routes","path","Home","About","Console","router","base","process","Vuex","summaryES","Store","state","summary","NetWork","mutations","update","payload","assign","actions","fetchSummary","commit","EventSource","location","host","onmessage","evt","JSON","parse","stopFetchSummary","close","ViewUI","config","productionTip","store","h","App","$mount"],"mappings":"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","file":"js/app.d106a496.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!../node_modules/iview-loader/index.js??ref--0-2!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!../node_modules/iview-loader/index.js??ref--0-2!./App.vue?vue&type=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/alipay.e872ea78.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('img',{attrs:{\"src\":require(\"../assets/logo.png\")}}),_c('div',[_c('p',[_vm._v(\" Monibuca 是一个开源的Go语言实现的流媒体服务器开发框架 \")]),_c('Button',{attrs:{\"type\":\"success\",\"to\":\"/docs\",\"target\":\"_blank\"}},[_vm._v(\"🚀START\")]),_c('span',{staticStyle:{\"margin\":\"0 10px\"}}),_c('Button',{attrs:{\"type\":\"default\",\"target\":\"_blank\",\"to\":\"https://github.com/langhuihui/monibuca\"}},[_c('svg',{staticStyle:{\"vertical-align\":\"text-top\"},attrs:{\"width\":\"16\",\"height\":\"16\",\"aria-labelledby\":\"simpleicons-github-dark-icon\",\"lang\":\"\",\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\"}},[_c('title',{attrs:{\"id\":\"simpleicons-github-dark-icon\",\"lang\":\"en\"}},[_vm._v(\"GitHub Dark icon\")]),_c('path',{attrs:{\"fill\":\"#7F8C8D\",\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}})]),_vm._v(\" GITHUB\")])],1),_c('Row',{staticStyle:{\"margin\":\"30px\"}},[_c('Col',{attrs:{\"span\":\"8\"}},[_c('Card',{staticStyle:{\"margin\":\"30px\"},attrs:{\"bordered\":false}},[_c('div',{staticClass:\"feature-title\",attrs:{\"slot\":\"title\"},slot:\"title\"},[_vm._v(\"⚡高性能\")]),_c('div',[_vm._v(\"针对流媒体服务器独特的性质进行的优化,充分利用Golang的goroutine的性质对大量的连接的读写进行合理的分配计算资源,以及尽可能的减少内存Copy操作。使用对象池减少Golang的GC时间。\")])])],1),_c('Col',{attrs:{\"span\":\"8\"}},[_c('Card',{staticStyle:{\"margin\":\"30px\"},attrs:{\"bordered\":false}},[_c('div',{staticClass:\"feature-title\",attrs:{\"slot\":\"title\"},slot:\"title\"},[_vm._v(\"🔧可扩展\")]),_c('div',[_vm._v(\"流媒体服务器的个性化定制变的更简单,基于Golang语言,开发效率更高,独创的插件机制,可以方便用户定制个性化的功能组合,更高效率的利用服务器资源。\")])])],1),_c('Col',{attrs:{\"span\":\"8\"}},[_c('Card',{staticStyle:{\"margin\":\"30px\"},attrs:{\"bordered\":false}},[_c('div',{staticClass:\"feature-title\",attrs:{\"slot\":\"title\"},slot:\"title\"},[_vm._v(\"📈可视化\")]),_c('div',[_vm._v(\"功能强大的仪表盘可以直观的看到服务器运行的状态、消耗的资源、以及其他统计信息。用户可以利用控制台对服务器进行配置和控制。点击右上角菜单栏里面的控制台,可以看到演示。\")])])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export * from \"-!../../node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"5b01838e-vue-loader-template\\\"}!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Home.vue?vue&type=template&id=54efad41&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('div',[_vm._v(\"Monibuca\")]),_c('Menu',{staticStyle:{\"position\":\"absolute\",\"top\":\"0\",\"right\":\"0\"},attrs:{\"mode\":\"horizontal\",\"active-name\":_vm.selectedMenu}},[_c('MenuItem',{attrs:{\"name\":\"home\",\"to\":\"/\"}},[_vm._v(\"首页\")]),_c('MenuItem',{attrs:{\"name\":\"docs\",\"to\":\"/docs\",\"target\":\"_blank\"}},[_vm._v(\" 文档 \")]),_c('MenuItem',{attrs:{\"name\":\"console\",\"to\":\"console\"}},[_vm._v(\" 控制台 \")]),_c('Submenu',{attrs:{\"name\":\"plugins\"}},[_c('template',{slot:\"title\"},[_vm._v(\" 内置插件 \")]),_c('MenuGroup',{attrs:{\"title\":\"发布者/订阅者\"}},[_c('MenuItem',{attrs:{\"name\":\"cluster\"}},[_vm._v(\"集群\")]),_c('MenuItem',{attrs:{\"name\":\"rtmp\"}},[_vm._v(\"RTMP\")])],1),_c('MenuGroup',{attrs:{\"title\":\"订阅者\"}},[_c('MenuItem',{attrs:{\"name\":\"jessica\"}},[_vm._v(\"Jessica\")]),_c('MenuItem',{attrs:{\"name\":\"HDL\"}},[_vm._v(\"Http-Flv\")]),_c('MenuItem',{attrs:{\"name\":\"record\"}},[_vm._v(\"录制Flv\")])],1),_c('MenuGroup',{attrs:{\"title\":\"发布者\"}},[_c('MenuItem',{attrs:{\"name\":\"HLS\"}},[_vm._v(\"HLS\")]),_c('MenuItem',{attrs:{\"name\":\"TS\"}},[_vm._v(\"TS\")])],1),_c('MenuGroup',{attrs:{\"title\":\"钩子\"}},[_c('MenuItem',{attrs:{\"name\":\"Auth\"}},[_vm._v(\"验证\")]),_c('MenuItem',{attrs:{\"name\":\"QoS\"}},[_vm._v(\"QoS\")]),_c('MenuItem',{attrs:{\"name\":\"gateway\"}},[_vm._v(\"网关\")])],1)],2),_c('MenuItem',{attrs:{\"name\":\"4\",\"to\":\"about\"}},[_vm._v(\" 支持 \")])],1),_c('router-view',{staticClass:\"content\"}),_c('div',[_vm._v(\"Copyright © 2019-2020 dexter 苏ICP备20001212号\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
Monibuca
\n
\n
\n
Copyright © 2019-2020 dexter 苏ICP备20001212号
\n
\n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!../node_modules/iview-loader/index.js??ref--0-2!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!../node_modules/iview-loader/index.js??ref--0-2!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=3991e6b4&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"root\"},[_c('h1',[_vm._v(\" 赞助 Monibuca 的研发 \")]),_c('p',[_vm._v(\" Monibuca 是采用 MIT 许可的开源项目,使用完全免费。 但是随着项目规模的增长,也需要有相应的资金支持才能持续项目的维护的开发。你可以通过下列的方法来赞助 Monibuca 的开发。 \")]),_c('img',{attrs:{\"src\":require(\"../assets/alipay.png\")}}),_c('img',{attrs:{\"src\":require(\"../assets/wechat.jpg\")}})])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./About.vue?vue&type=template&id=e34eab40&scoped=true&\"\nvar script = {}\nimport style0 from \"./About.vue?vue&type=style&index=0&id=e34eab40&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e34eab40\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"layout\"},[_c('ButtonGroup',{attrs:{\"vertical\":\"\"}},[_c('Button',{attrs:{\"icon\":\"ios-folder\"}}),_c('Button',{attrs:{\"icon\":\"md-bug\"}}),_c('Button',{attrs:{\"icon\":\"md-settings\"}})],1),_vm._l((_vm.Rooms),function(item){return _c('Card',{key:item.StreamPath,staticClass:\"room\"},[_c('p',{attrs:{\"slot\":\"title\"},slot:\"title\"},[_vm._v(\" \"+_vm._s(_vm.typeMap[item.Type]||item.Type)+_vm._s(item.StreamPath)+\" \")]),_c('StartTime',{attrs:{\"slot\":\"extra\",\"value\":item.StartTime},slot:\"extra\"}),_c('p',[_vm._v(\" \"+_vm._s(_vm.SoundFormat(item.AudioInfo.SoundFormat))+\" \"+_vm._s(item.AudioInfo.PacketCount)+\" \"+_vm._s(_vm.SoundRate(item.AudioInfo.SoundRate))+\" 声道:\"+_vm._s(item.AudioInfo.SoundType)+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.CodecID(item.VideoInfo.CodecID))+\" \"+_vm._s(item.VideoInfo.PacketCount)+\" \"+_vm._s(item.VideoInfo.SPSInfo.Width)+\"x\"+_vm._s(item.VideoInfo.SPSInfo.Height)+\" \")]),_c('ButtonGroup',{attrs:{\"size\":\"small\"}},[_c('Button',{attrs:{\"icon\":\"ios-people\"},on:{\"click\":function($event){return _vm.onShowDetail(item)}}},[_vm._v(\" \"+_vm._s(item.SubscriberInfo?item.SubscriberInfo.length:0)+\" \")]),(item.Type)?_c('Button',{attrs:{\"icon\":\"md-eye\"},on:{\"click\":function($event){return _vm.preview(item)}}}):_vm._e(),(_vm.isRecording(item))?_c('Button',{staticClass:\"recording\",attrs:{\"icon\":\"ios-radio-button-on\"},on:{\"click\":function($event){return _vm.stopRecord(item)}}}):_c('Button',{attrs:{\"icon\":\"ios-radio-button-on\"},on:{\"click\":function($event){return _vm.record(item)}}})],1)],1)}),(_vm.Rooms.length==0)?_c('div',{staticClass:\"empty\"},[_c('Icon',{attrs:{\"type\":\"md-wine\",\"size\":\"50\"}}),_vm._v(\" 没有任何房间 \")],1):_vm._e(),_c('div',{staticClass:\"status\"},[_c('Alert',[_vm._v(\" 带宽消耗 📥:\"+_vm._s(_vm.totalInNetSpeed)+\" 📤:\"+_vm._s(_vm.totalOutNetSpeed)+\" \")]),_c('Alert',{attrs:{\"type\":_vm.memoryStatus}},[_vm._v(\" 内存使用:\"+_vm._s(_vm.networkFormat(_vm.Memory.Used,\"M\"))+\" 占比:\"+_vm._s(_vm.Memory.Usage.toFixed(2))+\"% \")]),_c('Alert',{attrs:{\"type\":_vm.cpuStatus}},[_vm._v(\" CPU使用:\"+_vm._s(_vm.CPUUsage.toFixed(2))+\"% \")]),_c('Alert',{attrs:{\"type\":_vm.hardDiskStatus}},[_vm._v(\" 磁盘使用:\"+_vm._s(_vm.networkFormat(_vm.HardDisk.Used,\"M\"))+\" 占比:\"+_vm._s(_vm.HardDisk.Usage.toFixed(2))+\"% \")])],1),_c('Jessibuca',{ref:\"jessibuca\",model:{value:(_vm.showPreview),callback:function ($$v) {_vm.showPreview=$$v},expression:\"showPreview\"}})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Modal',_vm._g(_vm._b({attrs:{\"draggable\":\"\",\"title\":_vm.url},on:{\"on-ok\":_vm.onClosePreview,\"on-cancel\":_vm.onClosePreview}},'Modal',_vm.$attrs,false),_vm.$listeners),[_c('canvas',{staticStyle:{\"background\":\"black\"},attrs:{\"id\":\"canvas\",\"width\":\"488\",\"height\":\"275\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Jessibuca.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Jessibuca.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Jessibuca.vue?vue&type=template&id=2cdc76a4&\"\nimport script from \"./Jessibuca.vue?vue&type=script&lang=js&\"\nexport * from \"./Jessibuca.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Poptip',{attrs:{\"trigger\":\"hover\",\"content\":'⌚️'+ new Date(_vm.value).toLocaleString()}},[_c('Time',{attrs:{\"time\":new Date(_vm.value)}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./StartTime.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./StartTime.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StartTime.vue?vue&type=template&id=062b9730&scoped=true&\"\nimport script from \"./StartTime.vue?vue&type=script&lang=js&\"\nexport * from \"./StartTime.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"062b9730\",\n null\n \n)\n\nexport default component.exports","\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {{typeMap[item.Type]||item.Type}}{{item.StreamPath}}\r\n
\r\n \r\n \r\n {{SoundFormat(item.AudioInfo.SoundFormat)}} {{item.AudioInfo.PacketCount}}\r\n {{SoundRate(item.AudioInfo.SoundRate)}} 声道:{{item.AudioInfo.SoundType}}\r\n
\r\n \r\n {{CodecID(item.VideoInfo.CodecID)}} {{item.VideoInfo.PacketCount}}\r\n {{item.VideoInfo.SPSInfo.Width}}x{{item.VideoInfo.SPSInfo.Height}}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n 没有任何房间\r\n
\r\n
\r\n
\r\n 带宽消耗 📥:{{totalInNetSpeed}} 📤:{{totalOutNetSpeed}}\r\n \r\n
\r\n 内存使用:{{networkFormat(Memory.Used,\"M\")}} 占比:{{Memory.Usage.toFixed(2)}}%\r\n \r\n
\r\n CPU使用:{{CPUUsage.toFixed(2)}}%\r\n \r\n
\r\n 磁盘使用:{{networkFormat(HardDisk.Used,\"M\")}} 占比:{{HardDisk.Usage.toFixed(2)}}%\r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Console.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Console.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Console.vue?vue&type=template&id=c2fdc660&scoped=true&\"\nimport script from \"./Console.vue?vue&type=script&lang=js&\"\nexport * from \"./Console.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Console.vue?vue&type=style&index=0&id=c2fdc660&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c2fdc660\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\nimport About from '../views/About'\nimport Console from '../views/Console'\n\nVue.use(VueRouter)\n\nconst routes = [\n {\n path: '/',\n name: 'home',\n component: Home\n },\n {\n path: '/about',\n name: 'about',\n component: About\n }, {\n path: '/console',\n name: 'console',\n component: Console\n }\n]\n\nconst router = new VueRouter({\n mode: 'history',\n base: process.env.BASE_URL,\n routes\n})\n\nexport default router\n","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex)\nlet summaryES = null\n\nexport default new Vuex.Store({\n state: {\n summary:{\n NetWork:[],\n Rooms:[],\n Memory:{\n Used: 0,\n Usage: 0\n },\n CPUUsage:0,\n HardDisk:{\n Used: 0,\n Usage: 0\n }\n }\n },\n mutations: {\n update(state,payload){\n Object.assign(state,payload)\n }\n },\n actions: {\n fetchSummary({commit}){\n summaryES = new EventSource(\n \"//\" + location.host + \"/api/summary\"\n );\n summaryES.onmessage = evt=>{\n if (!evt.data) return\n let summary = JSON.parse(evt.data)\n commit(\"update\",{summary})\n }\n },\n stopFetchSummary(){\n summaryES.close()\n }\n },\n modules: {\n }\n})\n","import Vue from 'vue'\nimport ViewUI from 'view-design'\n\nVue.use(ViewUI)\n\nimport 'view-design/dist/styles/iview.css'\n","import Vue from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport './plugins/iview.js'\r\n\r\nVue.config.productionTip = false\r\n\r\nnew Vue({\r\n router,\r\n store,\r\n render: h => h(App)\r\n}).$mount('#app')\r\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./About.vue?vue&type=style&index=0&id=e34eab40&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./About.vue?vue&type=style&index=0&id=e34eab40&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Home.vue?vue&type=script&lang=js&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Home.vue?vue&type=style&index=0&id=54efad41&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Home.vue?vue&type=style&index=0&id=54efad41&scoped=true&lang=css&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=54efad41&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=54efad41&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"54efad41\",\n null\n \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/logo.b5357057.png\";","module.exports = __webpack_public_path__ + \"img/wechat.ff453262.jpg\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Console.vue?vue&type=style&index=0&id=c2fdc660&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!../../node_modules/iview-loader/index.js??ref--0-2!./Console.vue?vue&type=style&index=0&id=c2fdc660&scoped=true&lang=css&\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/dashboard/package.json b/dashboard/package.json
index a3e78ff..bcd41f1 100644
--- a/dashboard/package.json
+++ b/dashboard/package.json
@@ -48,6 +48,7 @@
"parser": "babel-eslint"
},
"rules": {
+ "no-console": "off",
"vue/no-parsing-error": [
2,
{
diff --git a/dashboard/src/views/Console.vue b/dashboard/src/views/Console.vue
index 3a74c3f..03559b3 100644
--- a/dashboard/src/views/Console.vue
+++ b/dashboard/src/views/Console.vue
@@ -18,22 +18,17 @@
{{CodecID(item.VideoInfo.CodecID)}} {{item.VideoInfo.PacketCount}}
{{item.VideoInfo.SPSInfo.Width}}x{{item.VideoInfo.SPSInfo.Height}}
-
-
-
-
+
+
+
+
+
+
@@ -164,10 +159,22 @@
return rate > 1000 ? (rate / 1000) + "kHz" : rate + "Hz"
},
record(item) {
- window.ajax.get("//" + location.host + "/api/record/flv",{streamPath:item.StreamPath})
+ window.ajax.get("//" + location.host + "/api/record/flv", {streamPath: item.StreamPath}, x => {
+ if (x == "success") {
+ this.$Message.success('开始录制');
+ } else {
+ this.$Message.error(x);
+ }
+ })
},
- stopRecord(item){
- window.ajax.get("//" + location.host + "/api/record/flv/stop",{streamPath:item.StreamPath})
+ stopRecord(item) {
+ window.ajax.get("//" + location.host + "/api/record/flv/stop", {streamPath: item.StreamPath}, x => {
+ if (x == "success") {
+ this.$Message.success('停止录制');
+ } else {
+ this.$Message.error(x);
+ }
+ })
},
isRecording(item) {
return item.SubscriberInfo && item.SubscriberInfo.find(x => x.Type == "FlvRecord")
@@ -201,7 +208,8 @@
.layout {
padding-bottom: 30px;
- position: relative;
+ display: flex;
+ flex-wrap: wrap;
}
.room {
diff --git a/main.go b/main.go
index 5c90456..dc8a9da 100644
--- a/main.go
+++ b/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "flag"
. "github.com/langhuihui/monibuca/monica"
_ "github.com/langhuihui/monibuca/plugins"
"log"
@@ -9,6 +10,8 @@ import (
func main() {
log.SetOutput(os.Stdout)
- Run("config.toml")
+ configPath := flag.String("c", "config.toml", "configFile")
+ flag.Parse()
+ Run(*configPath)
select {}
}
diff --git a/plugins/record/flv.go b/plugins/record/flv.go
index 856d96b..7b60a7a 100644
--- a/plugins/record/flv.go
+++ b/plugins/record/flv.go
@@ -7,6 +7,7 @@ import (
"github.com/langhuihui/monibuca/monica/util"
"io"
"os"
+ "path"
)
func SaveFlv(streamPath string, append bool) error {
@@ -17,11 +18,11 @@ func SaveFlv(streamPath string, append bool) error {
flag = flag | os.O_TRUNC | os.O_WRONLY
}
filePath := config.Path + streamPath + ".flv"
+ os.MkdirAll(path.Dir(filePath), 0666)
file, err := os.OpenFile(filePath, flag, 0666)
if err != nil {
return err
}
- defer file.Close()
p := OutputStream{SendHandler: func(packet *pool.SendPacket) error {
return avformat.WriteFLVTag(file, packet)
}}
@@ -47,7 +48,12 @@ func SaveFlv(streamPath string, append bool) error {
}
if err == nil {
recordings.Store(filePath, &p)
- go p.Play(streamPath)
+ go func() {
+ p.Play(streamPath)
+ file.Close()
+ }()
+ } else {
+ file.Close()
}
return err
}
diff --git a/plugins/record/index.go b/plugins/record/index.go
index c01f684..f731899 100644
--- a/plugins/record/index.go
+++ b/plugins/record/index.go
@@ -3,6 +3,7 @@ package record
import (
. "github.com/langhuihui/monibuca/monica"
"net/http"
+ "strings"
"sync"
)
@@ -20,6 +21,9 @@ func init() {
})
}
func run() {
+ if !strings.HasSuffix(config.Path, "/") {
+ config.Path = config.Path + "/"
+ }
http.HandleFunc("/api/record/flv", func(writer http.ResponseWriter, r *http.Request) {
if streamPath := r.URL.Query().Get("streamPath"); streamPath != "" {
if err := SaveFlv(streamPath, r.URL.Query().Get("append") != ""); err != nil {
diff --git a/plugins/rtmp/netStream.go b/plugins/rtmp/netStream.go
index 897c2be..5c0e9d8 100644
--- a/plugins/rtmp/netStream.go
+++ b/plugins/rtmp/netStream.go
@@ -87,6 +87,9 @@ func processRtmp(conn net.Conn) {
}
switch msg.MessageTypeID {
case RTMP_MSG_AMF0_COMMAND:
+ if msg.MsgData == nil {
+ break
+ }
cmd := msg.MsgData.(Commander).GetCommand()
switch cmd.CommandName {
case "createStream":