李勇

1.录制回放增加外部读取录制信息的接口,回放的时候先通过流名称获取播放地址,没有获取到的情况下再按拼接规则拼接

不能预览此文件类型
@@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter { @@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter {
62 constructor() { 62 constructor() {
63 super(); 63 super();
64 //sdk 信息 64 //sdk 信息
65 - GlobalConfig.sdkVersion = "v2.11.13.20170925"; 65 + GlobalConfig.sdkVersion = "v2.12.6.20170925";
66 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 66 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
67 67
68 //设置 68 //设置
@@ -1123,91 +1123,6 @@ export default class MessageEntrance extends Emiter { @@ -1123,91 +1123,6 @@ export default class MessageEntrance extends Emiter {
1123 loger.log("加入视频通话模块->不需要获取channelKey") 1123 loger.log("加入视频通话模块->不需要获取channelKey")
1124 this._joinClassSuccessSeting(); 1124 this._joinClassSuccessSeting();
1125 } 1125 }
1126 - /*  
1127 - //返回给客户端初始化成功的数据  
1128 - let joinClassSuccessCallBackData = {};  
1129 - joinClassSuccessCallBackData.isRecordPlayBack = GlobalConfig.isRecordPlayBack;  
1130 - joinClassSuccessCallBackData.DOCServerIP = GlobalConfig.DOCServerIP;  
1131 - joinClassSuccessCallBackData.DOCServerPort = GlobalConfig.DOCServerPort;  
1132 -  
1133 - joinClassSuccessCallBackData.classStatus = GlobalConfig.classStatus;  
1134 - joinClassSuccessCallBackData.classId = GlobalConfig.classId;  
1135 - joinClassSuccessCallBackData.className = GlobalConfig.className;  
1136 - joinClassSuccessCallBackData.h5Module = GlobalConfig.h5Module;  
1137 - joinClassSuccessCallBackData.isHost = GlobalConfig.isHost;  
1138 - joinClassSuccessCallBackData.maxAudioChannels = GlobalConfig.maxAudioChannels;  
1139 - joinClassSuccessCallBackData.maxVideoChannels = GlobalConfig.maxVideoChannels;  
1140 - joinClassSuccessCallBackData.maxMediaChannels = GlobalConfig.maxMediaChannels;  
1141 - joinClassSuccessCallBackData.mcuDelay = GlobalConfig.mcuDelay;  
1142 -  
1143 - joinClassSuccessCallBackData.msType = GlobalConfig.msType;  
1144 - joinClassSuccessCallBackData.nodeId = GlobalConfig.nodeId;  
1145 - joinClassSuccessCallBackData.password = GlobalConfig.password;  
1146 - joinClassSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired; // 老师的默认是true  
1147 - //GlobalConfig.passwordRequired 老师的默认是true  
1148 - //GlobalConfig.portal=_data.portal;  
1149 - joinClassSuccessCallBackData.role = GlobalConfig.role;  
1150 - joinClassSuccessCallBackData.siteId = GlobalConfig.siteId;  
1151 - joinClassSuccessCallBackData.topNodeID = GlobalConfig.topNodeID;  
1152 - joinClassSuccessCallBackData.userId = GlobalConfig.userId;  
1153 - joinClassSuccessCallBackData.userName = GlobalConfig.userName;  
1154 - joinClassSuccessCallBackData.userRole = GlobalConfig.userRole;  
1155 - joinClassSuccessCallBackData.userType = GlobalConfig.userType;  
1156 -  
1157 - joinClassSuccessCallBackData.siteId = GlobalConfig.siteId;  
1158 - joinClassSuccessCallBackData.classId = GlobalConfig.classId;  
1159 - joinClassSuccessCallBackData.userRole = GlobalConfig.userRole;  
1160 - joinClassSuccessCallBackData.userId = GlobalConfig.userId;  
1161 - joinClassSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;  
1162 - joinClassSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_1;  
1163 -  
1164 - joinClassSuccessCallBackData.country = GlobalConfig.country; //国家  
1165 - joinClassSuccessCallBackData.city = GlobalConfig.city; //城市  
1166 - joinClassSuccessCallBackData.province = GlobalConfig.province; //服务商  
1167 - joinClassSuccessCallBackData.isp = GlobalConfig.isp; //服务商  
1168 -  
1169 - joinClassSuccessCallBackData.classTimestamp = GlobalConfig.classTimestamp; //课堂进行的累积时间  
1170 - joinClassSuccessCallBackData.recordTimestamp = GlobalConfig.recordTimestamp; //课堂录制的累积时间  
1171 - joinClassSuccessCallBackData.recordPlaybackMaxTime = GlobalConfig.recordPlaybackMaxTime; //录制回放的总时间  
1172 -  
1173 - joinClassSuccessCallBackData.fps = GlobalConfig.fps;  
1174 - joinClassSuccessCallBackData.gop = GlobalConfig.gop;  
1175 - joinClassSuccessCallBackData.videoQuality = GlobalConfig.videoQuality;  
1176 -  
1177 - joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL;  
1178 - joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示  
1179 - joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;  
1180 -  
1181 - joinClassSuccessCallBackData.deviceType = GlobalConfig.deviceType;  
1182 - joinClassSuccessCallBackData.language = GlobalConfig.language;  
1183 - joinClassSuccessCallBackData.explorer = GlobalConfig.explorer;  
1184 - joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion;  
1185 - joinClassSuccessCallBackData.os = GlobalConfig.os;  
1186 -  
1187 - joinClassSuccessCallBackData.channelId =GlobalConfig.channelId ;  
1188 - joinClassSuccessCallBackData.channelKey =GlobalConfig.channelKey ;  
1189 - joinClassSuccessCallBackData.userUid = GlobalConfig.userUid;  
1190 - joinClassSuccessCallBackData.appId = GlobalConfig.appId;  
1191 - joinClassSuccessCallBackData.appCertificate = GlobalConfig.appCertificate;  
1192 - joinClassSuccessCallBackData.appRecordingKey = GlobalConfig.appRecordingKey;  
1193 -  
1194 - //设置日志上报所需的信息  
1195 - LogManager.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;//本地时间和服务器时间的差值(秒)  
1196 - LogManager.classId = GlobalConfig.classId;//课堂号  
1197 - LogManager.userId = GlobalConfig.userId;//userId  
1198 - LogManager.nodeId = GlobalConfig.nodeId;//nodeId  
1199 - LogManager.userRole = GlobalConfig.userRole;//userRole  
1200 - LogManager.userName = GlobalConfig.userName;//用户名称  
1201 - LogManager.logUrl = GlobalConfig.logUrl;//日志服务器地址 //http://log.3mang.com  
1202 - LogManager.platform=GlobalConfig.platform;  
1203 - loger.log('加入课堂成功->');  
1204 - loger.log(joinClassSuccessCallBackData);  
1205 -  
1206 - //加入课堂成功,广播消息  
1207 - this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);  
1208 -  
1209 - //加入音视频通话模块  
1210 - this._joinChannel({channelId:GlobalConfig.channelId,channelKey:GlobalConfig.channelKey ,uid:GlobalConfig.userUid,info:""+GlobalConfig.userRole});*/  
1211 } 1126 }
1212 //加入课堂成功之后设置本地数据和返回数据给客户端 1127 //加入课堂成功之后设置本地数据和返回数据给客户端
1213 _joinClassSuccessSeting(){ 1128 _joinClassSuccessSeting(){
@@ -1234,7 +1149,6 @@ export default class MessageEntrance extends Emiter { @@ -1234,7 +1149,6 @@ export default class MessageEntrance extends Emiter {
1234 //GlobalConfig.passwordRequired 老师的默认是true 1149 //GlobalConfig.passwordRequired 老师的默认是true
1235 //GlobalConfig.portal=_data.portal; 1150 //GlobalConfig.portal=_data.portal;
1236 joinClassSuccessCallBackData.role = GlobalConfig.role; 1151 joinClassSuccessCallBackData.role = GlobalConfig.role;
1237 - joinClassSuccessCallBackData.siteId = GlobalConfig.siteId;  
1238 joinClassSuccessCallBackData.topNodeID = GlobalConfig.topNodeID; 1152 joinClassSuccessCallBackData.topNodeID = GlobalConfig.topNodeID;
1239 joinClassSuccessCallBackData.userId = GlobalConfig.userId; 1153 joinClassSuccessCallBackData.userId = GlobalConfig.userId;
1240 joinClassSuccessCallBackData.userName = GlobalConfig.userName; 1154 joinClassSuccessCallBackData.userName = GlobalConfig.userName;
@@ -1758,13 +1672,14 @@ export default class MessageEntrance extends Emiter { @@ -1758,13 +1672,14 @@ export default class MessageEntrance extends Emiter {
1758 1672
1759 //获取课堂所有参数(20170727新规则) api/meeting/detail.do? flash中的接口文件是 getClassParam.do 1673 //获取课堂所有参数(20170727新规则) api/meeting/detail.do? flash中的接口文件是 getClassParam.do
1760 _sassGetClassParamSuccessHandler(_data) { 1674 _sassGetClassParamSuccessHandler(_data) {
1761 - loger.log('获取课堂课堂信息完成.'); 1675 + loger.log('获取课堂课堂信息完成.',_data.appConfig);
1762 //包含整个课堂最全的信息,储存数据 1676 //包含整个课堂最全的信息,储存数据
1763 if (_data) { 1677 if (_data) {
1764 GlobalConfig.mcuDelay = _data.h5Delay || 0; //mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用 1678 GlobalConfig.mcuDelay = _data.h5Delay || 0; //mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用
1765 GlobalConfig.className = _data.meetingName || ""; 1679 GlobalConfig.className = _data.meetingName || "";
1766 GlobalConfig.classBeginTime = _data.beginTime || ""; 1680 GlobalConfig.classBeginTime = _data.beginTime || "";
1767 GlobalConfig.classEndTime = _data.endTime || ""; 1681 GlobalConfig.classEndTime = _data.endTime || "";
  1682 + GlobalConfig.siteId=_data.siteID||"";//这个字段ID是大写的
1768 GlobalConfig.channelId = ""+GlobalConfig.siteId+"_"+GlobalConfig.classId; 1683 GlobalConfig.channelId = ""+GlobalConfig.siteId+"_"+GlobalConfig.classId;
1769 //sdk获取ip失败就使用saas返回的 1684 //sdk获取ip失败就使用saas返回的
1770 if(!GlobalConfig.userIp){ 1685 if(!GlobalConfig.userIp){
@@ -1887,7 +1802,7 @@ export default class MessageEntrance extends Emiter { @@ -1887,7 +1802,7 @@ export default class MessageEntrance extends Emiter {
1887 this._choiceMcuAndMsListFromSass(); 1802 this._choiceMcuAndMsListFromSass();
1888 //获取MCU和MS 推流拉流、录制回放的默认地址 1803 //获取MCU和MS 推流拉流、录制回放的默认地址
1889 this.getMcuAndMsDefaultServerIp(); 1804 this.getMcuAndMsDefaultServerIp();
1890 - _recordPlayback.readyRecordPlay(); 1805 + _recordPlayback.readyLoadRecordPlayData();
1891 } else { 1806 } else {
1892 loger.warn("开启录制回放流程失败->还未创建模块"); 1807 loger.warn("开启录制回放流程失败->还未创建模块");
1893 } 1808 }
@@ -2707,7 +2622,6 @@ export default class MessageEntrance extends Emiter { @@ -2707,7 +2622,6 @@ export default class MessageEntrance extends Emiter {
2707 //GlobalConfig.passwordRequired 老师的默认是true 2622 //GlobalConfig.passwordRequired 老师的默认是true
2708 //GlobalConfig.portal=_data.portal; 2623 //GlobalConfig.portal=_data.portal;
2709 joinClassSuccessCallBackData.role = GlobalConfig.role; 2624 joinClassSuccessCallBackData.role = GlobalConfig.role;
2710 - joinClassSuccessCallBackData.siteId = GlobalConfig.siteId;  
2711 joinClassSuccessCallBackData.topNodeID = GlobalConfig.topNodeID; 2625 joinClassSuccessCallBackData.topNodeID = GlobalConfig.topNodeID;
2712 joinClassSuccessCallBackData.userId = GlobalConfig.userId; 2626 joinClassSuccessCallBackData.userId = GlobalConfig.userId;
2713 joinClassSuccessCallBackData.userName = GlobalConfig.userName; 2627 joinClassSuccessCallBackData.userName = GlobalConfig.userName;
@@ -2986,6 +2900,7 @@ export default class MessageEntrance extends Emiter { @@ -2986,6 +2900,7 @@ export default class MessageEntrance extends Emiter {
2986 GlobalConfig.getChannelToken=_params.getChannelToken||"" 2900 GlobalConfig.getChannelToken=_params.getChannelToken||""
2987 GlobalConfig.getRecordInfoInterfaces=_params.getRecordInfoInterfaces||""; 2901 GlobalConfig.getRecordInfoInterfaces=_params.getRecordInfoInterfaces||"";
2988 GlobalConfig.stopRecordingInterfaces=_params.stopRecordingInterfaces||""; 2902 GlobalConfig.stopRecordingInterfaces=_params.stopRecordingInterfaces||"";
  2903 + GlobalConfig.getTxRecordInfoInterfaces=_params.getTxRecordInfoInterfaces||"";
2989 2904
2990 //去掉协议头 2905 //去掉协议头
2991 try{ 2906 try{
@@ -2997,6 +2912,11 @@ export default class MessageEntrance extends Emiter { @@ -2997,6 +2912,11 @@ export default class MessageEntrance extends Emiter {
2997 GlobalConfig.getRecordInfoInterfaces=GlobalConfig.getRecordInfoInterfaces.replace('http://',""); 2912 GlobalConfig.getRecordInfoInterfaces=GlobalConfig.getRecordInfoInterfaces.replace('http://',"");
2998 GlobalConfig.getRecordInfoInterfaces=GlobalConfig.getRecordInfoInterfaces.replace('https://',""); 2913 GlobalConfig.getRecordInfoInterfaces=GlobalConfig.getRecordInfoInterfaces.replace('https://',"");
2999 } 2914 }
  2915 + if(GlobalConfig.getTxRecordInfoInterfaces){
  2916 + GlobalConfig.getTxRecordInfoInterfaces=GlobalConfig.getTxRecordInfoInterfaces.replace('http://',"");
  2917 + GlobalConfig.getTxRecordInfoInterfaces=GlobalConfig.getTxRecordInfoInterfaces.replace('https://',"");
  2918 + }
  2919 +
3000 if(GlobalConfig.stopRecordingInterfaces){ 2920 if(GlobalConfig.stopRecordingInterfaces){
3001 GlobalConfig.stopRecordingInterfaces=GlobalConfig.stopRecordingInterfaces.replace('http://',""); 2921 GlobalConfig.stopRecordingInterfaces=GlobalConfig.stopRecordingInterfaces.replace('http://',"");
3002 GlobalConfig.stopRecordingInterfaces=GlobalConfig.stopRecordingInterfaces.replace('https://',""); 2922 GlobalConfig.stopRecordingInterfaces=GlobalConfig.stopRecordingInterfaces.replace('https://',"");
@@ -602,6 +602,7 @@ GlobalConfig.userUid = 0; @@ -602,6 +602,7 @@ GlobalConfig.userUid = 0;
602 GlobalConfig.recordInterfaces="";//控制开启录制和录制状态改变的接口 602 GlobalConfig.recordInterfaces="";//控制开启录制和录制状态改变的接口
603 GlobalConfig.getRecordInfoInterfaces="";//获取媒体录制信息数据的接口 603 GlobalConfig.getRecordInfoInterfaces="";//获取媒体录制信息数据的接口
604 GlobalConfig.stopRecordingInterfaces="";//停止录制的接口 604 GlobalConfig.stopRecordingInterfaces="";//停止录制的接口
  605 +GlobalConfig.getTxRecordInfoInterfaces="";//获取媒体录制信息数据的接口(tx)
605 606
606 GlobalConfig.getChannelToken="";//获取token的地址 607 GlobalConfig.getChannelToken="";//获取token的地址
607 export default GlobalConfig; 608 export default GlobalConfig;
@@ -7,6 +7,7 @@ import pdu from 'pdus/index'; @@ -7,6 +7,7 @@ import pdu from 'pdus/index';
7 import PduType from 'pdus/PduType'; 7 import PduType from 'pdus/PduType';
8 import PduConsts from 'pdus/PduConsts'; 8 import PduConsts from 'pdus/PduConsts';
9 import ApeConsts from 'apes/ApeConsts'; 9 import ApeConsts from 'apes/ApeConsts';
  10 +import MediaModule from "apes/MediaModule";
10 11
11 import ArrayBufferUtil from 'libs/ArrayBufferUtil'; 12 import ArrayBufferUtil from 'libs/ArrayBufferUtil';
12 import Base64 from 'base64-js'; 13 import Base64 from 'base64-js';
@@ -32,6 +33,9 @@ class RecordPlayBackParse extends Emiter { @@ -32,6 +33,9 @@ class RecordPlayBackParse extends Emiter {
32 this._recordPlaybackTimestamp = 0;//回放的时间 33 this._recordPlaybackTimestamp = 0;//回放的时间
33 this._recordPlaybackMaxTime = 0;//录制回放的总时间 34 this._recordPlaybackMaxTime = 0;//录制回放的总时间
34 this._isReady = false;//录制回放是否已经准备完成 35 this._isReady = false;//录制回放是否已经准备完成
  36 + this.isLoadTxRecordInfo=false;//是否已经加载腾讯云的录制数据
  37 + this.isLoadAgoraRecordInfo=false;//是否已经加载声网的录制数据
  38 +
35 this._apes = {}; 39 this._apes = {};
36 this._videoApeBroadcastMssages={};//视频模块的广播消息 40 this._videoApeBroadcastMssages={};//视频模块的广播消息
37 this.mediaChannleList={}; 41 this.mediaChannleList={};
@@ -250,7 +254,7 @@ class RecordPlayBackParse extends Emiter { @@ -250,7 +254,7 @@ class RecordPlayBackParse extends Emiter {
250 } 254 }
251 255
252 //加载录制文件rec 256 //加载录制文件rec
253 - readyRecordPlay() { 257 + readyLoadRecordPlayData() {
254 this.initReplay(); 258 this.initReplay();
255 loger.log("读取录制回放数据"); 259 loger.log("读取录制回放数据");
256 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`; 260 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
@@ -277,7 +281,6 @@ class RecordPlayBackParse extends Emiter { @@ -277,7 +281,6 @@ class RecordPlayBackParse extends Emiter {
277 if (ret) { 281 if (ret) {
278 loger.log('读取回放数据-完成'); 282 loger.log('读取回放数据-完成');
279 this._loadRecordDataSuccess(ret); 283 this._loadRecordDataSuccess(ret);
280 - this.getMediaRecrodInfo();  
281 } else { 284 } else {
282 loger.warn('读取回放数据-失败.'); 285 loger.warn('读取回放数据-失败.');
283 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_RECORD_PLAY_BACK_DATA_FAILED); 286 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_RECORD_PLAY_BACK_DATA_FAILED);
@@ -294,21 +297,37 @@ class RecordPlayBackParse extends Emiter { @@ -294,21 +297,37 @@ class RecordPlayBackParse extends Emiter {
294 if (parseBuffer) { 297 if (parseBuffer) {
295 parseBuffer.clear(); 298 parseBuffer.clear();
296 parseBuffer.append(arrayBuffer); 299 parseBuffer.append(arrayBuffer);
297 - //解析数据  
298 - this.parseArrayBuf(); 300 + //rec数据加载完成后,继续加载音视频相关的录制数据,然后再解析rec数据
  301 + this.getMediaRecrodInfoFromTx(()=>{
  302 + //解析录制的rec数据
  303 + this.isLoadTxRecordInfo=true;
  304 + if(this.isLoadTxRecordInfo&&this.isLoadAgoraRecordInfo){
  305 + this.parseArrayBuf();
  306 + }
  307 + });
  308 + this.getMediaRecrodInfoFromAgora(()=>{
  309 + this.isLoadAgoraRecordInfo=true;
  310 + //解析录制的rec数据
  311 + if(this.isLoadTxRecordInfo&&this.isLoadAgoraRecordInfo){
  312 + this.parseArrayBuf();
  313 + }
  314 + });
299 } 315 }
300 } 316 }
301 317
302 //获取媒体录制信息 318 //获取媒体录制信息
303 - getMediaRecrodInfo(){ 319 + getMediaRecrodInfoFromAgora(_callback){
304 //获取课堂录制信息 get localhost:3000/recordInfo/getRecordInfo/7d72365eb9834353397e3e3f9d460bdda 320 //获取课堂录制信息 get localhost:3000/recordInfo/getRecordInfo/7d72365eb9834353397e3e3f9d460bdda
305 //localhost:3000/recordInfo/getRecordInfo/ 后面直接添加课堂号 channel 321 //localhost:3000/recordInfo/getRecordInfo/ 后面直接添加课堂号 channel
306 if(!GlobalConfig.getRecordInfoInterfaces){ 322 if(!GlobalConfig.getRecordInfoInterfaces){
307 - loger.log("获取媒体录制信息->失败->接口地址无效"); 323 + loger.log("AG-获取媒体录制信息->失败->接口地址无效");
  324 + if(_callback){
  325 + _callback();
  326 + }
308 return ; 327 return ;
309 } 328 }
310 let url = `${GlobalConfig.locationProtocol+GlobalConfig.getRecordInfoInterfaces}/${GlobalConfig.channelId}`; 329 let url = `${GlobalConfig.locationProtocol+GlobalConfig.getRecordInfoInterfaces}/${GlobalConfig.channelId}`;
311 - loger.log('获取媒体录制信息.', url); 330 + loger.log('AG-获取媒体录制信息.', url);
312 fetch(url, { 331 fetch(url, {
313 timeout: 15000 332 timeout: 15000
314 }) 333 })
@@ -316,25 +335,118 @@ class RecordPlayBackParse extends Emiter { @@ -316,25 +335,118 @@ class RecordPlayBackParse extends Emiter {
316 if (ret.ok) { 335 if (ret.ok) {
317 return ret.json(); 336 return ret.json();
318 } else { 337 } else {
319 - loger.error(`获取媒体录制信息-网络异常.状态码:${ret}`); 338 + loger.error(`AG-获取媒体录制信息-网络异常.状态码:${ret}`);
  339 + if(_callback){
  340 + _callback();
  341 + }
320 throw ''; 342 throw '';
321 } 343 }
322 }) 344 })
323 .then(ret => { 345 .then(ret => {
324 - loger.log('获取媒体录制信息-完成',ret);  
325 - /* if (ret.errorCode == 0) {  
326 - loger.log('获取媒体录制信息-完成');  
327 - 346 + loger.log('AG-获取媒体录制信息-完成',ret);
  347 + if(_callback){
  348 + _callback();
  349 + }
  350 + })
  351 + .catch(err => {
  352 + loger.error(`AG-获取媒体录制信息-异常.状态码:${err}`);
  353 + if(_callback){
  354 + _callback();
  355 + }
  356 + });
  357 + }
  358 + //获取媒体录制信息
  359 + getMediaRecrodInfoFromTx(_callback){
  360 + if(!GlobalConfig.getTxRecordInfoInterfaces){
  361 + loger.log("TX-获取媒体录制信息->失败->接口地址无效");
  362 + if(_callback){
  363 + _callback();
  364 + }
  365 + return ;
  366 + }
  367 + let url = `${GlobalConfig.locationProtocol+GlobalConfig.getTxRecordInfoInterfaces}`;
  368 + loger.log('TX-获取媒体录制信息.', url);
  369 + //接口中用的是GET
  370 + fetch(encodeURI(url), {
  371 + method: 'POST',
  372 + headers: {
  373 + "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
  374 + },
  375 + body: `channelId=${ GlobalConfig.channelId}`,
  376 + timeout: 5000
  377 + })
  378 + .then(ret => {
  379 + if (ret.ok) {
  380 + return ret.json();
328 } else { 381 } else {
329 - loger.warn('获取媒体录制信息-失败.'); 382 + loger.error(`TX-获取媒体录制信息-网络异常.状态码:${ret}`);
  383 + if(_callback){
  384 + _callback();
  385 + }
  386 + throw '';
  387 + }
  388 + })
  389 + .then(ret => {
  390 + loger.log('TX-获取媒体录制信息-完成',ret);
  391 + /* {"code": 200,
  392 + "returnData":{
  393 + "data":[
  394 + {
  395 + "id": "0zo9GALQdmkwrJVYxqgaE6xM7j8yvOZN",
  396 + "channelId": "marketflashtest_1966232762",
  397 + "recordInfo": "",
  398 + "createTime": ""
  399 + }]
  400 + }
330 }*/ 401 }*/
  402 + if(ret&&ret.code==200){
  403 + if(ret.returnData&&ret.returnData.data){
  404 + this.parseAndSavaStreamInfoFromTx(ret.returnData.data);
  405 + }
  406 + }
  407 + if(_callback){
  408 + _callback();
  409 + }
331 }) 410 })
332 .catch(err => { 411 .catch(err => {
333 loger.error(`获取媒体录制信息-异常.状态码:${err}`); 412 loger.error(`获取媒体录制信息-异常.状态码:${err}`);
  413 + if(_callback){
  414 + _callback();
  415 + }
334 }); 416 });
335 } 417 }
336 418
337 - //解析数据 419 + //解析腾讯云录制的视频数据,数组[]
  420 + parseAndSavaStreamInfoFromTx(_dataArr){
  421 + /* "id": "0zo9GALQdmkwrJVYxqgaE6xM7j8yvOZN",
  422 + "channelId": "marketflashtest_1966232762",
  423 + "recordInfo":"xxxxx",
  424 + "createTime":"xxxx"*/
  425 + if(!_dataArr){
  426 + loger.log("TX-外部录制的视频数据无效");
  427 + return;
  428 + }
  429 + let item;
  430 + let itemJson;
  431 + loger.log("TX-外部录制的视频数据-length="+_dataArr.length)
  432 + for(let i=0;i<_dataArr.length;i++){
  433 + item=_dataArr[i];
  434 + if(item){
  435 + itemJson=item.recordInfo;
  436 + try{
  437 + itemJson=JSON.parse(itemJson);
  438 + }catch (err){
  439 +
  440 + }
  441 + if(itemJson&&itemJson.video_url){
  442 + MediaModule.streams[itemJson.stream_id]=itemJson.video_url;
  443 + }
  444 + }
  445 + }
  446 + console.log(" MediaModule.streams", MediaModule.streams);
  447 + }
  448 +
  449 + //解析录制的rec数据
338 parseArrayBuf() { 450 parseArrayBuf() {
339 //this._messages = {}; 451 //this._messages = {};
340 let byteLength = parseBuffer.offset; 452 let byteLength = parseBuffer.offset;
@@ -717,7 +829,7 @@ class RecordPlayBackParse extends Emiter { @@ -717,7 +829,7 @@ class RecordPlayBackParse extends Emiter {
717 let object_id = regUpdatedItem.objId; 829 let object_id = regUpdatedItem.objId;
718 let user_data = regUpdatedItem.userData; 830 let user_data = regUpdatedItem.userData;
719 831
720 - console.log('RCRegistryUpdateObjPdu',regUpdatedItem) 832 + //console.log('RCRegistryUpdateObjPdu',regUpdatedItem)
721 833
722 switch (sub_type) { 834 switch (sub_type) {
723 case pdu.RCPDU_REG_ROSTER_INSERT_PDU: 835 case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
@@ -101,6 +101,14 @@ class MediaModule { @@ -101,6 +101,14 @@ class MediaModule {
101 loger.warn('获取录制回放时点播的地址->参数错误', _param); 101 loger.warn('获取录制回放时点播的地址->参数错误', _param);
102 return {"code": ApeConsts.RETURN_FAILED, "data": ""}; 102 return {"code": ApeConsts.RETURN_FAILED, "data": ""};
103 } 103 }
  104 +
  105 + //如果是外部的流地址,不需要拼接,直接使用就可以,是完整的地址
  106 + let streamPlayUrl=MediaModule.streams[_param.streamId]
  107 + if(streamPlayUrl){
  108 + loger.log("使用外部的流地址->",streamPlayUrl);
  109 + return {"code": ApeConsts.RETURN_SUCCESS, "data": "", "playUrl":streamPlayUrl};
  110 + }
  111 +
104 //M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8 112 //M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8
105 let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "" : ":" + GlobalConfig.RS_RECORD_PLAY_PORT; 113 let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "" : ":" + GlobalConfig.RS_RECORD_PLAY_PORT;
106 //let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP 114 //let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP
@@ -411,5 +419,6 @@ class MediaModule { @@ -411,5 +419,6 @@ class MediaModule {
411 } 419 }
412 } 420 }
413 MediaModule.allMediaChannelsList = {};//当前已经创建的所有音视频通道(包含释放或未未释放的) 421 MediaModule.allMediaChannelsList = {};//当前已经创建的所有音视频通道(包含释放或未未释放的)
  422 +MediaModule.streams={};//记录流名称对应的数据
414 export default MediaModule; 423 export default MediaModule;
415 424