李勇

1.录制增加时间限制,默认为4小时(14400秒),课堂初始化的接口增加字段allowRecordMaxTime(Number)来控制录制的时间

2.加入课堂成功之后返回的参数中增加了录制回放的总时间长
3.录制模块增加了录制数据读取和录制数据用计时器回放的功能
4.录制模块增加状态更新的接口
... ... @@ -73,7 +73,7 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ }
/******/ var hotApplyOnUpdate = true;
/******/ var hotCurrentHash = "b965c2eac4c1a05349c9"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentHash = "9888fa83a0623fa73680"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
... ... @@ -669,7 +669,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _RecordPlayBackParse2 = _interopRequireDefault(_RecordPlayBackParse);
var _mcu2 = __webpack_require__(37);
var _mcu2 = __webpack_require__(38);
var _mcu3 = _interopRequireDefault(_mcu2);
... ... @@ -681,7 +681,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _Loger2 = _interopRequireDefault(_Loger);
var _ConferApe = __webpack_require__(39);
var _ConferApe = __webpack_require__(40);
var _ConferApe2 = _interopRequireDefault(_ConferApe);
... ... @@ -743,7 +743,7 @@ return /******/ (function(modules) { // webpackBootstrap
__webpack_require__(13);
var loger = _Loger2.default.getLoger('MessageEntrance');
var _sdkInfo = { "version": "v.1.0.2017.0307", "author": "www.3mang.com" };
var _sdkInfo = { "version": "v.1.7.0.20170309-1", "author": "www.3mang.com" };
//APE
var _sass = void 0;
... ... @@ -874,10 +874,6 @@ return /******/ (function(modules) { // webpackBootstrap
_this.pauseRecordPlayback = _this._pauseRecordPlayback.bind(_this);
_this.seekRecordPlayback = _this._seekRecordPlayback.bind(_this);
_this.addBuffer = _this._addBuffer.bind(_this);
_this.read = _this._read.bind(_this);
_this.writeBuffer = _this._writeBuffer.bind(_this);
//chatApe
_this.sendChatMsg = _this._sendChatMsg.bind(_this);
... ... @@ -1072,6 +1068,11 @@ return /******/ (function(modules) { // webpackBootstrap
_GlobalConfig2.default.userId = _param.userId || "0";
_GlobalConfig2.default.userName = _param.userName || "";
//最长允许录制的时间
if (_param.allowRecordMaxTime) {
_GlobalConfig2.default.allowRecordMaxTime = parseInt(_param.allowRecordMaxTime);
}
//获取课堂校验信息
if (_sass) {
_sass.getJoinParams(_GlobalConfig2.default.getClassInfo());
... ... @@ -1372,6 +1373,8 @@ return /******/ (function(modules) { // webpackBootstrap
joinClassSuccessCallBackData.province = _GlobalConfig2.default.province; //服务商
joinClassSuccessCallBackData.isp = _GlobalConfig2.default.isp; //服务商
joinClassSuccessCallBackData.classTimestamp = _GlobalConfig2.default.classTimestamp; //课堂进行的累积时间
joinClassSuccessCallBackData.recordPlaybackMaxTime = _GlobalConfig2.default.recordPlaybackMaxTime; //录制回放的总时间
loger.log('加入课堂成功');
console.log(joinClassSuccessCallBackData);
... ... @@ -1988,28 +1991,8 @@ return /******/ (function(modules) { // webpackBootstrap
_parseBuf.seekRecordPlayback(_param);
}
}
}, {
key: '_writeBuffer',
value: function _writeBuffer(_param) {
if (_parseBuf) {
_parseBuf.writeBuffer(_param);
}
}
}, {
key: '_addBuffer',
value: function _addBuffer(_arrayBuffer) {
if (_parseBuf) {
_parseBuf.addBuffer(_arrayBuffer);
}
}
}, {
key: '_read',
value: function _read(_param) {
if (_parseBuf) {
_parseBuf.read(_param);
}
}
// MCU 课堂成功
//录制回放加入 课堂成功
}, {
key: '_joinRecordPlaybackSuccessHandler',
... ... @@ -2059,6 +2042,9 @@ return /******/ (function(modules) { // webpackBootstrap
joinClassSuccessCallBackData.province = _GlobalConfig2.default.province; //服务商
joinClassSuccessCallBackData.isp = _GlobalConfig2.default.isp; //服务商
joinClassSuccessCallBackData.classTimestamp = _GlobalConfig2.default.classTimestamp; //课堂进行的累积时间
joinClassSuccessCallBackData.recordPlaybackMaxTime = _GlobalConfig2.default.recordPlaybackMaxTime; //录制回放的总时间
console.log(joinClassSuccessCallBackData);
//和加入课堂成功使用同样的消息处理
this._emit(_MessageTypes2.default.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
... ... @@ -2957,6 +2943,10 @@ return /******/ (function(modules) { // webpackBootstrap
//MessageTypes.WHITEBOARD_ANNOTAION_DELETE = 'whiteboard.annotation.delete';
//MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear';
//录制回放
MessageTypes.RECORD_PLAYBACK_UPDATE = "record_playback_update"; //录制回放更新信息
//错误事件定义
MessageTypes.MCU_ERROR = "mcu_error"; //"mcuError";//MCU错误(内部使用)
MessageTypes.ERROR_EVENT = "error_event"; //外部监听错误的消息ID(外部使用)
... ... @@ -3499,7 +3489,7 @@ return /******/ (function(modules) { // webpackBootstrap
GlobalConfig.isp = ""; //服务商
GlobalConfig.isRecordPlayBack = false; //是否是录制回放,默认是否
GlobalConfig.allowRecordMaxTime = 14400; //(秒)允许录制的最长时间,默认是4小时
var _default = GlobalConfig;
exports.default = _default;
;
... ... @@ -5914,6 +5904,10 @@ return /******/ (function(modules) { // webpackBootstrap
var _EngineUtils2 = _interopRequireDefault(_EngineUtils);
var _TimerCounter = __webpack_require__(37);
var _TimerCounter2 = _interopRequireDefault(_TimerCounter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
... ... @@ -5923,9 +5917,13 @@ return /******/ (function(modules) { // webpackBootstrap
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var parseBuffer = void 0;
// 日志对象
var loger = _Loger2.default.getLoger('RecordPlayBackParse');
var Default = 0; //未开始
var PLAY = 1; //播放中
var PAUSE = 2; //暂停
var SEEK = 3; //seek
var STOP = 4; //停止
var RecordPlayBackParse = function (_Emiter) {
_inherits(RecordPlayBackParse, _Emiter);
... ... @@ -5939,9 +5937,15 @@ return /******/ (function(modules) { // webpackBootstrap
parseBuffer = new _bytebuffer2.default(_bytebuffer2.default.DEFAULT_CAPACITY, _bytebuffer2.default.LITTLE_ENDIAN);
parseBuffer.clear();
console.log(parseBuffer);
_this._recordPlaybackTimestamp = 0; //回放的时间
_this._recordPlaybackMaxTime = 0; //录制回放的总时间
_this._apes = {};
_this._messages = {};
_this._timerCounter = new _TimerCounter2.default(); //计时器
_this._timerCounter.addTimerCallBack(_this._timerCounterUptate.bind(_this), 1);
return _this;
}
//method--------------------内部---------------------------------------------
// 注册Ape
... ... @@ -6006,7 +6010,39 @@ return /******/ (function(modules) { // webpackBootstrap
}
}
//method------------外部接口-------------------------------------
//开启计时器
}, {
key: '_startTimerCounter',
value: function _startTimerCounter() {
this._timerCounter.startTimer();
}
//停止计时器
}, {
key: '_stopTimerCounter',
value: function _stopTimerCounter() {
this._timerCounter.stopTimer();
}
}, {
key: '_timerCounterUptate',
value: function _timerCounterUptate() {
this._recordPlaybackTimestamp = this._recordPlaybackTimestamp + 1; //计时
if (this._recordPlaybackTimestamp >= this._recordPlaybackMaxTime) {
this._stopTimerCounter();
loger.log("录制结束...当前时间->", this._recordPlaybackTimestamp, " 总时间->", this._recordPlaybackMaxTime);
this._emit(_MessageTypes2.default.RECORD_PLAYBACK_UPDATE, { "status": STOP });
return;
}
loger.log("录制回放中...", this._recordPlaybackTimestamp);
this._emit(_MessageTypes2.default.CLASS_UPDATE_TIMER, { "classTimestamp": this._recordPlaybackTimestamp });
//根据时间查找消息数据
this._searchMessageFromTime(this._recordPlaybackTimestamp);
}
//加载录制文件
}, {
... ... @@ -6014,12 +6050,13 @@ return /******/ (function(modules) { // webpackBootstrap
value: function readyRecordPlay() {
var _this2 = this;
this._stopTimerCounter();
loger.log("读取回放数据");
//let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
var url = 'http://' + _GlobalConfig2.default.RecordServerIP + ':' + _GlobalConfig2.default.RecordServerPort + '/' + _GlobalConfig2.default.recordFileName;
console.log(url);
fetch(url, {
timeout: 90000
timeout: 90000 //加载文件超时时间1分30秒
}).then(function (ret) {
if (ret.ok) {
return ret.arrayBuffer();
... ... @@ -6048,53 +6085,97 @@ return /******/ (function(modules) { // webpackBootstrap
if (parseBuffer) {
parseBuffer.clear();
parseBuffer.append(arrayBuffer);
//解析数据
this.parseArrayBuf();
}
this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS);
}
}, {
key: 'addArrayBuffer',
value: function addArrayBuffer(arrayBuffer) {
loger.log("addArrayBuffer", arrayBuffer.byteLength);
parseBuffer.append(arrayBuffer, "binary");
}
//解析数据
}, {
key: 'read',
value: function read() {
//loger.log("readUInt64", parseBuffer.readUInt64(0));
//loger.log("readUInt32", parseBuffer.readUInt32(8));
//loger.log("readByte", parseBuffer.readByte(12));
key: 'parseArrayBuf',
value: function parseArrayBuf() {
this._messages = {};
var byteLength = parseBuffer.offset;
parseBuffer.byteOffset = 0;
var position = 0;
while (position < byteLength) {
var time = parseBuffer.readUInt64(position, true);
position += 8;
var len = parseBuffer.readUInt32(position, true);
position += 4;
var byte = parseBuffer.buffer.slice(position, position + len);
position += len;
console.log(time, len, byte);
this._everSocketMsgReceivedHandler(byte);
var timestamp = parseBuffer.readUInt32(position);
position += 4; //4字节
var byteLen = parseBuffer.readUInt32(position);
position += 4; //4字节
var byteData = parseBuffer.buffer.slice(position, position + byteLen);
position += byteLen;
console.log(timestamp, byteLen, byteData);
var messageItem = this._messages[timestamp];
if (!messageItem) {
this._messages[timestamp] = []; //数组存数据,因为有1秒内收到多个消息的情况,timestamp是按秒记录的
messageItem = this._messages[timestamp];
}
messageItem.push({ "timestamp": timestamp, "byteData": byteData });
//记录最后一个数据的时间戳作为整个录制回放的总时间戳
this._recordPlaybackMaxTime = timestamp;
}
this._recordPlaybackTimestamp = 0;
this._stopTimerCounter();
_GlobalConfig2.default.recordPlaybackMaxTime = this._recordPlaybackMaxTime;
loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime);
console.log(this._messages);
this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, { "recordPlaybackMaxTime": this._recordPlaybackMaxTime });
}
//根据时间查找数据
}, {
key: 'writeBuffer',
value: function writeBuffer() {
parseBuffer.writeUint64(123456789, 0).flip();
parseBuffer.writeUint32(22211122, 8).flip();
key: '_searchMessageFromTime',
value: function _searchMessageFromTime(_timestamp) {
var msgDataArr = this._messages[_timestamp];
if (!msgDataArr) {
//没有数据,需要查找当前时间点属于哪一个时间戳关键帧
} else {
//把时间点对应的数据发送,同一秒内有存在多个数据的情况
for (var i = 0; i < msgDataArr.length; i++) {
this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);
}
}
}
//method------------外部接口-------------------------------------
}, {
key: 'startRecordPlayback',
value: function startRecordPlayback(_param) {}
value: function startRecordPlayback(_param) {
this._startTimerCounter();
return { "code": _ApeConsts2.default.RETURN_SUCCESS, "data": "ok" };
//this._apes(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":});
}
}, {
key: 'stopRecordPlayback',
value: function stopRecordPlayback(_param) {}
value: function stopRecordPlayback(_param) {
this._recordPlaybackTimestamp = 0;
this._stopTimerCounter();
return { "code": _ApeConsts2.default.RETURN_SUCCESS, "data": "ok" };
}
}, {
key: 'pauseRecordPlayback',
value: function pauseRecordPlayback(_param) {}
value: function pauseRecordPlayback(_param) {
this._stopTimerCounter();
return { "code": _ApeConsts2.default.RETURN_SUCCESS, "data": "ok" };
}
}, {
key: 'seekRecordPlayback',
value: function seekRecordPlayback(_param) {}
value: function seekRecordPlayback(_param) {
if (!_param || !_param.time) {
return { "code": _ApeConsts2.default.RETURN_FAILED, "data": "参数不正确" };
}
this._stopTimerCounter();
this._recordPlaybackTimestamp = _param.time || 0;
this._startTimerCounter();
return { "code": _ApeConsts2.default.RETURN_SUCCESS, "data": "ok" };
}
}]);
return RecordPlayBackParse;
... ... @@ -6116,6 +6197,16 @@ return /******/ (function(modules) { // webpackBootstrap
__REACT_HOT_LOADER__.register(loger, 'loger', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(Default, 'Default', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(PLAY, 'PLAY', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(PAUSE, 'PAUSE', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(SEEK, 'SEEK', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(STOP, 'STOP', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(RecordPlayBackParse, 'RecordPlayBackParse', 'D:/work/McuClient/src/RecordPlayBackParse.js');
__REACT_HOT_LOADER__.register(_default, 'default', 'D:/work/McuClient/src/RecordPlayBackParse.js');
... ... @@ -17602,6 +17693,113 @@ return /******/ (function(modules) { // webpackBootstrap
/***/ },
/* 37 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// //////////////////////////////////////////////////////////////////////////////
// 计时器
// //////////////////////////////////////////////////////////////////////////////
var TimerCounter = function () {
function TimerCounter() {
_classCallCheck(this, TimerCounter);
this.timer = 0;
this.delay = 1000;
this.counter = 0;
this.callBackDelay = 1; //回调间隔,单位(秒)
this.callBackFun = null; //回调函数
this.isStart = false;
}
_createClass(TimerCounter, [{
key: "addTimerCallBack",
value: function addTimerCallBack(_callBackFun, _callBackDelay) {
this.callBackFun = _callBackFun;
this.callBackDelay = _callBackDelay;
}
//开计时
}, {
key: "startTimer",
value: function startTimer() {
var _position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (this.isStart) return;
this.isStart = true;
if (_position && parseInt(_position) > 0) {
this.counter = _position;
} else {
this.counter = 0;
}
console.log("startTimer", this.counter);
this.timerClear();
this.timerStart();
}
//停止
}, {
key: "stopTimer",
value: function stopTimer() {
if (!this.isStart) return;
console.log("stopTimer", this.counter);
this.isStart = false;
this.timerClear();
}
//计数
}, {
key: "updateCounter",
value: function updateCounter() {
this.counter++;
//this.counter++;
//console.log("TimerCounter",counter);
if (this.callBackFun != null && this.counter % this.callBackDelay == 0) {
this.callBackFun();
}
}
}, {
key: "timerStart",
value: function timerStart() {
this.timer = setInterval(this.updateCounter.bind(this), this.delay);
}
}, {
key: "timerClear",
value: function timerClear() {
clearInterval(this.timer);
}
}]);
return TimerCounter;
}();
var _default = TimerCounter;
exports.default = _default;
;
var _temp = function () {
if (typeof __REACT_HOT_LOADER__ === 'undefined') {
return;
}
__REACT_HOT_LOADER__.register(TimerCounter, "TimerCounter", "D:/work/McuClient/src/TimerCounter.js");
__REACT_HOT_LOADER__.register(_default, "default", "D:/work/McuClient/src/TimerCounter.js");
}();
;
/***/ },
/* 38 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
... ... @@ -17624,7 +17822,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _Loger2 = _interopRequireDefault(_Loger);
var _everSocket = __webpack_require__(38);
var _everSocket = __webpack_require__(39);
var _everSocket2 = _interopRequireDefault(_everSocket);
... ... @@ -17644,7 +17842,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _ApeConsts2 = _interopRequireDefault(_ApeConsts);
var _ConferApe = __webpack_require__(39);
var _ConferApe = __webpack_require__(40);
var _ConferApe2 = _interopRequireDefault(_ConferApe);
... ... @@ -17904,7 +18102,7 @@ return /******/ (function(modules) { // webpackBootstrap
;
/***/ },
/* 38 */
/* 39 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
... ... @@ -18147,7 +18345,7 @@ return /******/ (function(modules) { // webpackBootstrap
;
/***/ },
/* 39 */
/* 40 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
... ... @@ -18158,7 +18356,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -18174,7 +18372,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _pdus2 = _interopRequireDefault(_pdus);
var _zlib = __webpack_require__(41);
var _zlib = __webpack_require__(42);
var _utf = __webpack_require__(11);
... ... @@ -18192,7 +18390,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _EngineUtils2 = _interopRequireDefault(_EngineUtils);
var _TimerCounter = __webpack_require__(42);
var _TimerCounter = __webpack_require__(37);
var _TimerCounter2 = _interopRequireDefault(_TimerCounter);
... ... @@ -18378,6 +18576,12 @@ return /******/ (function(modules) { // webpackBootstrap
}, {
key: 'startRecord',
value: function startRecord() {
//如果录制的时间长超出设定的最大录制时间就不再录制
if (_GlobalConfig2.default.classTimestamp >= _GlobalConfig2.default.allowRecordMaxTime) {
loger.warn('不能再录制,录制时间已经达到最大限制', _GlobalConfig2.default.classTimestamp);
return;
}
loger.log('startRecord', "isHost", _GlobalConfig2.default.isHost, "recordStatus", _GlobalConfig2.default.recordStatus);
//如果是host
if (_GlobalConfig2.default.isHost) {
... ... @@ -18929,7 +19133,7 @@ return /******/ (function(modules) { // webpackBootstrap
;
/***/ },
/* 40 */
/* 41 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
... ... @@ -18948,7 +19152,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _Emiter3 = _interopRequireDefault(_Emiter2);
var _mcu = __webpack_require__(37);
var _mcu = __webpack_require__(38);
var _mcu2 = _interopRequireDefault(_mcu);
... ... @@ -19031,7 +19235,8 @@ return /******/ (function(modules) { // webpackBootstrap
//先收到onJoinSessionHandlerSuccess 后收到 onJoinChannelHandlerSuccess
loger.log("APE-->registerApe");
loger.log('APE-->registerApe->', 'SessionId', _this._session_id, 'SessionName', _this._session_name, 'SessionTag', _this._session_tag);
// 监听底层MCU课堂
_this.mcu = _mcu2.default;
_this.mcu.on(_MessageTypes2.default.CLASS_JOIN_MCU_SUCCESS, _this._mcuConferenceJoinSuccessHandler.bind(_this));
... ... @@ -19409,7 +19614,7 @@ return /******/ (function(modules) { // webpackBootstrap
;
/***/ },
/* 41 */
/* 42 */
/***/ function(module, exports) {
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';function l(d){throw d;}var v=void 0,x=!0,aa=this;function D(d,a){var c=d.split("."),e=aa;!(c[0]in e)&&e.execScript&&e.execScript("var "+c[0]);for(var b;c.length&&(b=c.shift());)!c.length&&a!==v?e[b]=a:e=e[b]?e[b]:e[b]={}};var F="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function H(d,a){this.index="number"===typeof a?a:0;this.i=0;this.buffer=d instanceof(F?Uint8Array:Array)?d:new (F?Uint8Array:Array)(32768);2*this.buffer.length<=this.index&&l(Error("invalid index"));this.buffer.length<=this.index&&this.f()}H.prototype.f=function(){var d=this.buffer,a,c=d.length,e=new (F?Uint8Array:Array)(c<<1);if(F)e.set(d);else for(a=0;a<c;++a)e[a]=d[a];return this.buffer=e};
... ... @@ -19454,112 +19659,6 @@ return /******/ (function(modules) { // webpackBootstrap
/***/ },
/* 42 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// //////////////////////////////////////////////////////////////////////////////
// 计时器
// //////////////////////////////////////////////////////////////////////////////
var TimerCounter = function () {
function TimerCounter() {
_classCallCheck(this, TimerCounter);
this.timer = 0;
this.delay = 1000;
this.counter = 0;
this.callBackDelay = 1; //回调间隔,单位(秒)
this.callBackFun = null; //回调函数
this.isStart = false;
}
_createClass(TimerCounter, [{
key: "addTimerCallBack",
value: function addTimerCallBack(_callBackFun, _callBackDelay) {
this.callBackFun = _callBackFun;
this.callBackDelay = _callBackDelay;
}
//开计时
}, {
key: "startTimer",
value: function startTimer() {
var _position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (this.isStart) return;
this.isStart = true;
if (_position && parseInt(_position) > 0) {
this.counter = _position;
} else {
this.counter = 0;
}
console.log("startTimer", this.counter);
this.timerClear();
this.timerStart();
}
//停止
}, {
key: "stopTimer",
value: function stopTimer() {
console.log("stopTimer", this.counter);
this.isStart = false;
this.timerClear();
}
//计数
}, {
key: "updateCounter",
value: function updateCounter() {
this.counter++;
//this.counter++;
//console.log("TimerCounter",counter);
if (this.callBackFun != null && this.counter % this.callBackDelay == 0) {
this.callBackFun();
}
}
}, {
key: "timerStart",
value: function timerStart() {
this.timer = setInterval(this.updateCounter.bind(this), this.delay);
}
}, {
key: "timerClear",
value: function timerClear() {
clearInterval(this.timer);
}
}]);
return TimerCounter;
}();
var _default = TimerCounter;
exports.default = _default;
;
var _temp = function () {
if (typeof __REACT_HOT_LOADER__ === 'undefined') {
return;
}
__REACT_HOT_LOADER__.register(TimerCounter, "TimerCounter", "D:/work/McuClient/src/TimerCounter.js");
__REACT_HOT_LOADER__.register(_default, "default", "D:/work/McuClient/src/TimerCounter.js");
}();
;
/***/ },
/* 43 */
/***/ function(module, exports, __webpack_require__) {
... ... @@ -19571,7 +19670,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -19724,7 +19823,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -20454,7 +20553,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -20940,7 +21039,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -21585,7 +21684,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Ape2 = __webpack_require__(40);
var _Ape2 = __webpack_require__(41);
var _Ape3 = _interopRequireDefault(_Ape2);
... ... @@ -21605,7 +21704,7 @@ return /******/ (function(modules) { // webpackBootstrap
var _MessageTypes2 = _interopRequireDefault(_MessageTypes);
var _zlib = __webpack_require__(41);
var _zlib = __webpack_require__(42);
var _utf = __webpack_require__(11);
... ...
... ... @@ -25,7 +25,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('MessageEntrance');
let _sdkInfo = {"version": "v.1.0.2017.0307", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v.1.7.0.20170309-1", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -132,10 +132,6 @@ export default class MessageEntrance extends Emiter {
this.pauseRecordPlayback = this._pauseRecordPlayback.bind(this);
this.seekRecordPlayback = this._seekRecordPlayback.bind(this);
this.addBuffer = this._addBuffer.bind(this);
this.read = this._read.bind(this);
this.writeBuffer = this._writeBuffer.bind(this);
//chatApe
this.sendChatMsg = this._sendChatMsg.bind(this);
... ... @@ -298,6 +294,11 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.userId = _param.userId || "0";
GlobalConfig.userName = _param.userName || "";
//最长允许录制的时间
if(_param.allowRecordMaxTime){
GlobalConfig.allowRecordMaxTime=parseInt(_param.allowRecordMaxTime);
}
//获取课堂校验信息
if (_sass) {
_sass.getJoinParams(GlobalConfig.getClassInfo());
... ... @@ -569,6 +570,8 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData.province = GlobalConfig.province;//服务商
joinClassSuccessCallBackData.isp = GlobalConfig.isp;//服务商
joinClassSuccessCallBackData.classTimestamp=GlobalConfig.classTimestamp;//课堂进行的累积时间
joinClassSuccessCallBackData.recordPlaybackMaxTime=GlobalConfig.recordPlaybackMaxTime;//录制回放的总时间
loger.log('加入课堂成功');
console.log(joinClassSuccessCallBackData);
... ... @@ -1068,24 +1071,7 @@ export default class MessageEntrance extends Emiter {
}
}
_writeBuffer(_param) {
if (_parseBuf) {
_parseBuf.writeBuffer(_param);
}
}
_addBuffer(_arrayBuffer) {
if (_parseBuf) {
_parseBuf.addBuffer(_arrayBuffer);
}
}
_read(_param) {
if (_parseBuf) {
_parseBuf.read(_param);
}
}
// MCU 课堂成功
//录制回放加入 课堂成功
_joinRecordPlaybackSuccessHandler(_data) {
loger.log('加入录制回放成功.');
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2);
... ... @@ -1132,6 +1118,9 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData.province = GlobalConfig.province;//服务商
joinClassSuccessCallBackData.isp = GlobalConfig.isp;//服务商
joinClassSuccessCallBackData.classTimestamp=GlobalConfig.classTimestamp;//课堂进行的累积时间
joinClassSuccessCallBackData.recordPlaybackMaxTime=GlobalConfig.recordPlaybackMaxTime;//录制回放的总时间
console.log(joinClassSuccessCallBackData);
//和加入课堂成功使用同样的消息处理
this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
... ...
... ... @@ -332,5 +332,5 @@ GlobalConfig.province = "";//服务商
GlobalConfig.isp ="";//服务商
GlobalConfig.isRecordPlayBack=false;//是否是录制回放,默认是否
GlobalConfig.allowRecordMaxTime=14400;//(秒)允许录制的最长时间,默认是4小时
export default GlobalConfig;
... ...
... ... @@ -63,6 +63,10 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'wh
//MessageTypes.WHITEBOARD_ANNOTAION_DELETE = 'whiteboard.annotation.delete';
//MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear';
//录制回放
MessageTypes.RECORD_PLAYBACK_UPDATE ="record_playback_update";//录制回放更新信息
//错误事件定义
MessageTypes.MCU_ERROR ="mcu_error";//"mcuError";//MCU错误(内部使用)
MessageTypes.ERROR_EVENT="error_event";//外部监听错误的消息ID(外部使用)
... ...
... ... @@ -11,21 +11,33 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Base64 from 'base64-js';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import TimerCounter from "TimerCounter";
let parseBuffer;
let parseBuffer;
// 日志对象
const loger = Loger.getLoger('RecordPlayBackParse');
const Default=0;//未开始
const PLAY=1;//播放中
const PAUSE=2;//暂停
const SEEK=3;//seek
const STOP=4;//停止
class RecordPlayBackParse extends Emiter {
constructor() {
super();
loger.log("RecordPlayBackParse");
parseBuffer = new ByteBuffer( ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);
parseBuffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN);
parseBuffer.clear();
console.log(parseBuffer);
this._recordPlaybackTimestamp = 0;//回放的时间
this._recordPlaybackMaxTime = 0;//录制回放的总时间
this._apes = {};
this._messages = {};
this._timerCounter = new TimerCounter();//计时器
this._timerCounter.addTimerCallBack(this._timerCounterUptate.bind(this), 1);
}
//method--------------------内部---------------------------------------------
// 注册Ape
registerApe(ape) {
... ... @@ -40,11 +52,11 @@ class RecordPlayBackParse extends Emiter {
//*************非常重要******************
//客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端,
//所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的
if(pduType==PduType.RCPDU_UNIFORM_SEND_DATA_REQUEST){
pduMsg.type=PduType.RCPDU_SEND_DATA_REQUEST;
pduType=PduType.RCPDU_SEND_DATA_REQUEST;
if (pduType == PduType.RCPDU_UNIFORM_SEND_DATA_REQUEST) {
pduMsg.type = PduType.RCPDU_SEND_DATA_REQUEST;
pduType = PduType.RCPDU_SEND_DATA_REQUEST;
}
loger.log('pduType',pduType);
loger.log('pduType', pduType);
switch (pduType) {
case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:
//加入课堂请求返回数据处理
... ... @@ -83,15 +95,41 @@ class RecordPlayBackParse extends Emiter {
}
}
//method------------外部接口-------------------------------------
//开启计时器
_startTimerCounter() {
this._timerCounter.startTimer();
}
//停止计时器
_stopTimerCounter() {
this._timerCounter.stopTimer();
}
_timerCounterUptate() {
this._recordPlaybackTimestamp = this._recordPlaybackTimestamp + 1;//计时
if(this._recordPlaybackTimestamp>=this._recordPlaybackMaxTime){
this._stopTimerCounter();
loger.log("录制结束...当前时间->", this._recordPlaybackTimestamp," 总时间->",this._recordPlaybackMaxTime);
this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":STOP});
return;
}
loger.log("录制回放中...", this._recordPlaybackTimestamp);
this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": this._recordPlaybackTimestamp});
//根据时间查找消息数据
this._searchMessageFromTime(this._recordPlaybackTimestamp);
}
//加载录制文件
readyRecordPlay(){
readyRecordPlay() {
this._stopTimerCounter();
loger.log("读取回放数据");
//let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
let url=`http://${ GlobalConfig.RecordServerIP}:${ GlobalConfig.RecordServerPort}/${GlobalConfig.recordFileName}`;
let url = `http://${ GlobalConfig.RecordServerIP}:${ GlobalConfig.RecordServerPort}/${GlobalConfig.recordFileName}`;
console.log(url);
fetch(url, {
timeout: 90000
timeout: 90000 //加载文件超时时间1分30秒
})
.then(ret => {
if (ret.ok) {
... ... @@ -117,57 +155,90 @@ class RecordPlayBackParse extends Emiter {
});
}
_loadRecordDataSuccess(arrayBuffer){
loger.log("获取录制回放数据的长度",arrayBuffer.byteLength);
if(parseBuffer){
_loadRecordDataSuccess(arrayBuffer) {
loger.log("获取录制回放数据的长度", arrayBuffer.byteLength);
if (parseBuffer) {
parseBuffer.clear();
parseBuffer.append(arrayBuffer);
//解析数据
this.parseArrayBuf();
}
this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS);
}
addArrayBuffer(arrayBuffer) {
loger.log("addArrayBuffer", arrayBuffer.byteLength);
parseBuffer.append(arrayBuffer, "binary");
}
read() {
//loger.log("readUInt64", parseBuffer.readUInt64(0));
//loger.log("readUInt32", parseBuffer.readUInt32(8));
//loger.log("readByte", parseBuffer.readByte(12));
let byteLength=parseBuffer.offset;
parseBuffer.byteOffset=0;
//解析数据
parseArrayBuf() {
this._messages = {};
let byteLength = parseBuffer.offset;
parseBuffer.byteOffset = 0;
var position = 0;
while (position<byteLength){
var time = parseBuffer.readUInt64(position, true);
position += 8;
var len = parseBuffer.readUInt32(position, true);
position += 4;
var byte = parseBuffer.buffer.slice(position, (position+len));
position += len;
console.log(time, len, byte);
this._everSocketMsgReceivedHandler(byte);
while (position < byteLength) {
let timestamp = parseBuffer.readUInt32(position);
position += 4;//4字节
let byteLen = parseBuffer.readUInt32(position);
position += 4;//4字节
let byteData = parseBuffer.buffer.slice(position, (position + byteLen));
position += byteLen;
console.log(timestamp, byteLen, byteData);
let messageItem=this._messages[timestamp];
if(!messageItem){
this._messages[timestamp]=[];//数组存数据,因为有1秒内收到多个消息的情况,timestamp是按秒记录的
messageItem=this._messages[timestamp];
}
messageItem.push({"timestamp": timestamp, "byteData": byteData});
//记录最后一个数据的时间戳作为整个录制回放的总时间戳
this._recordPlaybackMaxTime=timestamp;
}
this._recordPlaybackTimestamp=0;
this._stopTimerCounter();
GlobalConfig.recordPlaybackMaxTime=this._recordPlaybackMaxTime;
loger.log("录制回放数据解析完成,录制回放的总时间长为->",this._recordPlaybackMaxTime);
console.log(this._messages);
this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS,{"recordPlaybackMaxTime":this._recordPlaybackMaxTime});
}
writeBuffer() {
parseBuffer.writeUint64(123456789, 0).flip();
parseBuffer.writeUint32(22211122, 8).flip();
//根据时间查找数据
_searchMessageFromTime(_timestamp){
let msgDataArr=this._messages[_timestamp];
if(!msgDataArr){
//没有数据,需要查找当前时间点属于哪一个时间戳关键帧
}else {
//把时间点对应的数据发送,同一秒内有存在多个数据的情况
for(let i=0;i<msgDataArr.length;i++){
this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);
}
}
}
//method------------外部接口-------------------------------------
startRecordPlayback(_param) {
this._startTimerCounter();
return {"code": ApeConsts.RETURN_SUCCESS,"data": "ok"};
//this._apes(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":});
}
stopRecordPlayback(_param) {
this._recordPlaybackTimestamp = 0;
this._stopTimerCounter();
return {"code": ApeConsts.RETURN_SUCCESS,"data": "ok"};
}
pauseRecordPlayback(_param) {
this._stopTimerCounter()
return {"code": ApeConsts.RETURN_SUCCESS,"data": "ok"};
}
seekRecordPlayback(_param) {
if(!_param||!_param.time){
return {"code": ApeConsts.RETURN_FAILED,"data": "参数不正确"};
}
this._stopTimerCounter()
this._recordPlaybackTimestamp = _param.time || 0;
this._startTimerCounter();
return {"code": ApeConsts.RETURN_SUCCESS,"data": "ok"};
}
}
... ...
... ... @@ -32,6 +32,7 @@ class TimerCounter {
}
//停止
stopTimer(){
if(!this.isStart) return;
console.log("stopTimer",this.counter);
this.isStart=false;
this.timerClear();
... ...
... ... @@ -51,7 +51,14 @@ export default class Ape extends Emiter {
//先收到onJoinSessionHandlerSuccess 后收到 onJoinChannelHandlerSuccess
loger.log("APE-->registerApe");
loger.log('APE-->registerApe->',
'SessionId',
this._session_id,
'SessionName',
this._session_name,
'SessionTag',
this._session_tag);
// 监听底层MCU课堂
this.mcu = McuObj;
this.mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuConferenceJoinSuccessHandler.bind(this));
... ...
... ... @@ -176,6 +176,12 @@ class ConferApe extends Ape {
//开启录制
startRecord() {
//如果录制的时间长超出设定的最大录制时间就不再录制
if(GlobalConfig.classTimestamp>=GlobalConfig.allowRecordMaxTime){
loger.warn('不能再录制,录制时间已经达到最大限制',GlobalConfig.classTimestamp);
return;
}
loger.log('startRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus);
//如果是host
if (GlobalConfig.isHost) {
... ...