李勇

新增屏幕共享功能

此 diff 太大无法显示。
... ... @@ -28,7 +28,7 @@ import MediaModule from 'apes/MediaModule';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.25.2.201705025", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.27.10.201705026", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -149,6 +149,10 @@ export default class MessageEntrance extends Emiter {
//chatApe
this.sendChatMsg = this._sendChatMsg.bind(this);
//屏幕共享
this.publishScreenShare = this._publishScreenShare.bind(this);
this.stopPublishScreenShare = this._stopPublishScreenShare.bind(this);
//videoApe
//this.getVideoPlayPath = this._getVideoPlayPath.bind(this);
this.getVideoPublishPath = this._getVideoPublishPath.bind(this);
... ... @@ -324,6 +328,7 @@ export default class MessageEntrance extends Emiter {
let data = {"nodeId": _param.nodeId};
if (_video_ape) {
_video_ape.stopPublishVideo(data);
_video_ape.stopPublishScreenShare(data);
}
if (_audio_ape) {
_audio_ape.stopPublishAudio(data);
... ... @@ -555,7 +560,7 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.MS_PLAY_HLS_IP =ipItem;//ip包含了端口
GlobalConfig.MS_PLAY_HLS_PORT ="";
loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP );
}else if(ipItem.indexOf('rtmppush')>=0){
}else if(ipItem.indexOf('rtmppull')>=0){
//直播的时候rtmp拉流地址
GlobalConfig.MS_PLAY_RTMP_IP=ipItem;//ip包含了端口
GlobalConfig.MS_PLAY_RTMP_PORT ='';
... ... @@ -1067,6 +1072,7 @@ export default class MessageEntrance extends Emiter {
//停止推流
if (_video_ape) {
_video_ape.stopPublishVideo();
_video_ape.stopPublishScreenShare();
}
if (_audio_ape) {
_audio_ape.stopPublishAudio();
... ... @@ -1123,6 +1129,19 @@ export default class MessageEntrance extends Emiter {
}
}
//屏幕共享
//开始屏幕共享
_publishScreenShare(_param){
if(_video_ape){
_video_ape.publishScreenShare(_param);
}
}
//停止屏幕共享
_stopPublishScreenShare(_param){
if(_video_ape){
_video_ape.stopPublishScreenShare(_param);
}
}
//VidoeApe
videoUpdate(_data) {
//视频同步的消息发送改变,需要通知ferApe模块中的用户更新状态
... ...
... ... @@ -61,6 +61,22 @@ MessageTypes.AUDIO_GET_PUBLISH_PATH= "audio_get_publish_path";//获å–音频推æ
MessageTypes.AUDIO_PUBLISH_RESULT= "audio_publish_result";//获取音频推流结果
//屏幕共享
MessageTypes.SCREEN_SHARE_PLAY ="screen_share_play";// 屏幕共享播放视频
MessageTypes.SCREEN_SHARE_STOP ="screen_share_stop"; //屏幕共享停止视频
MessageTypes.SCREEN_SHARE_UPDATE ="screen_share_update";// //
MessageTypes.SCREEN_SHARE_BROADCAST= "screen_share_broadcast";//'屏幕共享控制广播消息;
MessageTypes.SCREEN_SHARE_GET_PUBLISH_PATH= "screen_share_get_publish_path";//获取屏幕共享推流地址
MessageTypes.SCREEN_SHARE_PUBLISH_RESULT= "screen_share_publish_result";//获取屏幕共享推流结果
//sdk中屏幕共享的事件监听
MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS= "publish_screen_share_success";//屏幕共享流发布成
MessageTypes.PUBLISH_SCREEN_SHARE_FAILE= "publish_screen_share_faile";//屏幕共享流发布失败
MessageTypes.PUBLISH_SCREEN_SHARE_CLOSE= "publish_screen_share_close";//屏幕共享流关闭
MessageTypes.PUBLISH_SCREEN_SHARE_DISCONNECT= "publish_screen_share_disconnect";//屏幕共享服务器没有连接
MessageTypes.PUBLISH_SCREEN_SHARE_CONNECTED= "publish_screen_share_connected";//获取屏幕共享服务器已经连接
//文档模块事件定义
MessageTypes.DOC_DELETE="document_delete";//'document.delete';//删除文档
MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更)
... ...
... ... @@ -380,7 +380,12 @@ export default class Ape extends Emiter {
);
uniformPdu.data = appPdu.toArrayBuffer();
// Mcu发送
this.mcu.send(uniformPdu);
if(this.mcu){
this.mcu.send(uniformPdu);
}else {
loger.warn('MCU为空->无法发送消息',uniformPdu);
}
}
sendChatUniform(appPdu, top) {
... ...
... ... @@ -109,6 +109,7 @@ ApeConsts.CHANNEL_STATUS_OPENING = 1;///< 已经占用成功
ApeConsts.MEDIA_TYPE_DEFAULT=0;//没有类型
ApeConsts.MEDIA_TYPE_VIDEO=1;//视频流(包含音频)
ApeConsts.MEDIA_TYPE_AUDIO=2;//音频流
ApeConsts.MEDIA_TYPE_SHARE=3;//屏幕共享
//return返回值状态
ApeConsts.RETURN_SUCCESS=0;//成功
... ...
... ... @@ -17,6 +17,7 @@ class MediaModule {
this.maxMediaChannel=0;
this.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT;
this.MEDIA_OBJ_TABLE_ID=0;
this.SCREENSHARING_OBJ_TABLE_ID=ApeConsts.SCREENSHARING_OBJ_TABLE_ID;
}
//获取播流地址
... ... @@ -129,7 +130,7 @@ class MediaModule {
getMediaPublishPathForInVisible(_param) {
let mediaLen=Object.keys(MediaModule.allMediaChannelsList={}).length;
let freeChannel=(this.MEDIA_OBJ_TABLE_ID-20-mediaLen)||GlobalConfig.nodeId;
loger.log('getMediaPublishPathForInVisible->'+freeChannel+" mediaLen:"+mediaLen);
loger.log('监课获取推流地址->'+freeChannel+" mediaLen:"+mediaLen);
//默认方式推流
let pubType="live";
//flash推流
... ... @@ -165,6 +166,47 @@ class MediaModule {
};
}
//桌面共享获取推流地址,频道号由外部传入
getMediaPublishPathForScreenShare(_shareChannel,_publishType) {
let shareChannel=_shareChannel||this.SCREENSHARING_OBJ_TABLE_ID;
loger.log('桌面共享获取推流地址->'+shareChannel);
//默认方式推流
let pubType="flash";
//flash推流
if(_publishType=="live"){
pubType ="live";
}
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId=GlobalConfig.siteId+"_"
+ GlobalConfig.classId + "_"+GlobalConfig.userId
+"_" + shareChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/"+pubType+"/" +streamId;
publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉
/* this.needPublishMediaChannel[publishUrl]={
"channelId":shareChannel,
"publishUrl":publishUrl,
"streamId":streamId,
"timestamp":timestamp,
"nodeId":GlobalConfig.nodeId
};*/
return {"code": ApeConsts.RETURN_SUCCESS,
"data":"",
"mediaId":shareChannel,
"publishUrl": publishUrl,
"streamId":streamId
};
}
//获取当前空闲的channel,返回值为0代表没有空闲的,否则返回的就是空闲的channelId
getFreeMediaChannel() {
let counter = 0;
... ...
... ... @@ -10,7 +10,7 @@ import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import MediaModule from "./MediaModule";
import ShareApe from './ShareApe';
let loger = Loger.getLoger('VideoApe');
class VideoApe extends Ape {
... ... @@ -25,6 +25,13 @@ class VideoApe extends Ape {
this.mediaModule.MEDIA_OBJ_TABLE_ID=ApeConsts.VIDEO_OBJ_TABLE_ID;
this.mediaModule.mediaChannels={};
this.mediaModule.mediaType=ApeConsts.MEDIA_TYPE_VIDEO;
this.shareApe=new ShareApe();
this.shareApe.on(MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS,this.onPublishScreenShareSuccess.bind(this));
this.shareApe.on(MessageTypes.PUBLISH_SCREEN_SHARE_FAILE,this.onPublishScreenShareFaile.bind(this));
this.shareApe.on(MessageTypes.PUBLISH_SCREEN_SHARE_CLOSE,this.onPublishScreenShareClose.bind(this));
this.shareApe.on(MessageTypes.PUBLISH_SCREEN_SHARE_DISCONNECT,this.onPublishScreenShareDisconnect.bind(this));
this.shareApe.on(MessageTypes.PUBLISH_SCREEN_SHARE_CONNECTED,this.onPublishScreenShareConnected.bind(this));
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
... ... @@ -176,6 +183,117 @@ class VideoApe extends Ape {
this._releaseNodeIdAllChannel(nodeId);
}
}
//==========================屏幕共享=========================================================================
//监听屏幕共享发布成功
onPublishScreenShareSuccess(){
loger.log('屏幕共享推流成功之后才能更新同步消息->');
//屏幕共享推流成功之后才能更新同步消息
let channelInfo=this.shareApe.getPublishChannelInfo();
this.sendTableUpdateHandler(channelInfo);
this._emit( MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS,{"code": ApeConsts.RETURN_SUCCESS, "data":"桌面共享推流!","mediaId":channelInfo.channelId});
return {"code": ApeConsts.RETURN_SUCCESS, "data":"桌面共享推流!","mediaId":channelInfo.channelId};
}
//屏幕共享连接打开
onPublishScreenShareFaile(){
loger.log('屏幕共享推流失败->');
this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_FAILE);
}
//屏幕共享连接关闭
onPublishScreenShareClose(){
loger.log('屏幕共享推流关闭->');
this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_CLOSE);
}
//屏幕共享连接失败
onPublishScreenShareDisconnect(){
loger.log('屏幕共享服务器连接失败->');
this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_DISCONNECT);
}
//屏幕共享连接失败
onPublishScreenShareConnected(){
loger.log('屏幕共享服务器连接成功->');
this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_CONNECTED);
}
//桌面共享推流
publishScreenShare(_param) {
if(!this.mcu.connected){
loger.warn(GlobalConfig.getCurrentStatus());
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_FAILED, "data":"已经断开连接!","mediaId":0});
return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
}
/* if (_param == null||_param.publishUrl == null)
{
loger.warn('桌面共享推流->参数错误', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_FAILED, "data":"桌面共享推流参数错误!","mediaId":0});
return {"code": ApeConsts.RETURN_FAILED, "data": "桌面共享推流参数错误"};
}*/
/*
//根据推流的地址获取对应的频道信息
let needPublishChannelInfo=this.mediaModule.getNeedPublishMediaChannel(_param.publishUrl);
if(needPublishChannelInfo==null){
loger.warn('桌面共享推流->推流数据已经无效', _param);
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_FAILED, "data":"推流数据已经无效!","mediaId":0});
return {"code": ApeConsts.RETURN_FAILED, "data": "推流数据已经无效"};
}*/
/*//判断当前是否还有空闲的channle
let freeChannel = this.mediaModule.getFreeMediaChannel();
if (freeChannel == 0) {
loger.warn("推流->不能再打开更多的设备 ");
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_FAILED, "data":"不能再打开更多的设备!","mediaId":0});
return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels};
}
//判断当前的频道是否已经占用
if(this.mediaModule.checkChannelIsOpening(needPublishChannelInfo.channelId)){
if(needPublishChannelInfo.nodeId==GlobalConfig.nodeId){
loger.warn(needPublishChannelInfo.channelId,"已经推送过消息,不需要再次推送");
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_SUCCESS, "data":"已经推送过消息,不需要再次推送!","mediaId":needPublishChannelInfo.channelId});
return {"code": ApeConsts.RETURN_SUCCESS, "data":"已经推送过消息,不需要再次推送!","mediaId":needPublishChannelInfo.channelId};
}else {
loger.warn(needPublishChannelInfo.channelId,"频道已经被占用");
this._emit( MessageTypes.VIDEO_PUBLISH_RESULT,{"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!","mediaId":0});
return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!","mediaChannels":this.mediaModule.mediaChannels};
}
}*/
/* let channelInfo=this.mediaModule.getDefaultChannelInfo();
channelInfo.owner=GlobalConfig.nodeId;
channelInfo.status=ApeConsts.CHANNEL_STATUS_OPENING;
channelInfo.channelId=needPublishChannelInfo.channelId;
channelInfo.streamId=needPublishChannelInfo.streamId;//按规则拼接的流名称
channelInfo.timestamp=needPublishChannelInfo.timestamp;//时间戳
channelInfo.mediaType=ApeConsts.MEDIA_TYPE_SHARE;//类型为屏幕共享*/
let publishType='flash';
if(_param&&_param.type=='live'){
publishType='live';
}
//获取屏幕共享推流的地址
let shareResult=this.mediaModule.getMediaPublishPathForScreenShare(this.shareApe.channelId,publishType);
this.shareApe.publish(shareResult);
}
//停止桌面共享推流
stopPublishScreenShare(_param) {
loger.log('停止桌面共享推流->',_param);
//if(!this.mcu.connected){
// loger.warn(GlobalConfig.getCurrentStatus());
// return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
//}
let channelInfo=this.shareApe.getDefaultChannelInfo();
channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED;
this.sendTableUpdateHandler(channelInfo);
this.shareApe.stopPublish();
}
//=============================屏幕共享 end=================================================
//释放nodeId占用的指定的channelId频道
_releaseChannelForNodeId(nodeId,channelId){
loger.log(nodeId,"_releaseChannelForNodeId-->channelId",channelId);
... ... @@ -352,7 +470,7 @@ class VideoApe extends Ape {
tableUpdateHandler(owner, itemIdx, itemData,seek) {
// debugger;
let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData);
loger.log("tableUpdateHandler->channel",itemIdx,'status->',unpackChannelInfo.status,"seek->",seek);
loger.log("tableUpdateHandler->channel",itemIdx,'mediaType',unpackChannelInfo.mediaType,'status->',unpackChannelInfo.status,"seek->",seek);
//****很重要********
//如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0)
... ... @@ -361,8 +479,10 @@ class VideoApe extends Ape {
unpackChannelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED;
unpackChannelInfo.streamId="";
}
this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo;
//屏幕共享的流不保存
if(unpackChannelInfo.mediaType!=ApeConsts.MEDIA_TYPE_SHARE){
this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo;
}
if(unpackChannelInfo&&unpackChannelInfo.fromNodeId!=GlobalConfig.nodeId){
let receiveChannelInfo={};
... ... @@ -370,6 +490,7 @@ class VideoApe extends Ape {
receiveChannelInfo.fromNodeId=unpackChannelInfo.fromNodeId;
receiveChannelInfo.userName=unpackChannelInfo.userName||"";
receiveChannelInfo.userRole=unpackChannelInfo.userRole||ApeConsts.normal;
receiveChannelInfo.mediaType=unpackChannelInfo.mediaType||ApeConsts.MEDIA_TYPE_DEFAULT;
//消息不是自己同步的,需要处理
if(unpackChannelInfo.status==ApeConsts.CHANNEL_STATUS_OPENING){
//正在推流
... ... @@ -392,13 +513,27 @@ class VideoApe extends Ape {
if(replay.code==0){
receiveChannelInfo.replay=replay.playUrl;
}
loger.log("VIDEO_PLAY",receiveChannelInfo);
//广播播放视频的消息
this._emit(MessageTypes.VIDEO_PLAY, receiveChannelInfo);
if(unpackChannelInfo.mediaType!=ApeConsts.MEDIA_TYPE_SHARE){
//广播播放视频的消息
loger.log("VIDEO_PLAY",receiveChannelInfo);
this._emit(MessageTypes.VIDEO_PLAY, receiveChannelInfo);
}else{
//停止播放屏幕共享
loger.log("SCREEN_SHARE_PLAY",receiveChannelInfo);
this._emit(MessageTypes.SCREEN_SHARE_PLAY, receiveChannelInfo);
}
}else {
loger.log("VIDEO_STOP",receiveChannelInfo);
//流已经停止
this._emit(MessageTypes.VIDEO_STOP, receiveChannelInfo);
if(unpackChannelInfo.mediaType!=ApeConsts.MEDIA_TYPE_SHARE){
//停止播放视频
loger.log("VIDEO_STOP",receiveChannelInfo);
this._emit(MessageTypes.VIDEO_STOP, receiveChannelInfo);
}else{
//停止播放屏幕共享
loger.log("SCREEN_SHARE_STOP",receiveChannelInfo);
this._emit(MessageTypes.SCREEN_SHARE_STOP, receiveChannelInfo);
}
}
}else {
loger.warn("视频消息是自己发送的或者是视频消息无效,不需要处理,消息内容如下:");
... ... @@ -410,19 +545,29 @@ class VideoApe extends Ape {
GlobalConfig.openCamera=0;
GlobalConfig.openMicrophones=0;
}
this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE,{
nodeId:GlobalConfig.nodeId,
userRole:GlobalConfig.userRole,
userName:GlobalConfig.userName,
userId:GlobalConfig.userId,
openCamera:GlobalConfig.openCamera,
openMicrophones:GlobalConfig.openMicrophones
//更新用户的摄像头和麦克风状态
if(unpackChannelInfo.mediaType!=ApeConsts.MEDIA_TYPE_SHARE) {
//非屏幕共享的情况下才更新状态
this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, {
nodeId: GlobalConfig.nodeId,
userRole: GlobalConfig.userRole,
userName: GlobalConfig.userName,
userId: GlobalConfig.userId,
openCamera: GlobalConfig.openCamera,
openMicrophones: GlobalConfig.openMicrophones
});
}
}
if(unpackChannelInfo.mediaType!=ApeConsts.MEDIA_TYPE_SHARE){
//非屏幕共享情况的处理
MediaModule.allMediaChannelsList[itemIdx]=unpackChannelInfo;
console.log('MediaModule.allMediaChannelsList',MediaModule.allMediaChannelsList);
this._emit(MessageTypes.VIDEO_UPDATE, unpackChannelInfo);
}
MediaModule.allMediaChannelsList[itemIdx]=unpackChannelInfo;
console.log('MediaModule.allMediaChannelsList',MediaModule.allMediaChannelsList);
this._emit(MessageTypes.VIDEO_UPDATE, unpackChannelInfo);
}
///////数据的封包和解包/////////////////////////////////////////
... ...
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.share=t():e.share=t()}(this,function(){return function(e){function t(n){if(_[n])return _[n].exports;var a=_[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var _={};return t.m=e,t.c=_,t.p="",t(0)}([function(e,t,_){e.exports=_(2)},function(e,t){"use strict";function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var _=0;_<t.length;_++){var n=t[_];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,_,n){return _&&e(t.prototype,_),n&&e(t,n),t}}(),a=function(){function e(){_(this,e),this.MAPS={}}return n(e,[{key:"on",value:function(e,t){if(e&&t){var _=this.MAPS[e];if(!_)return this.MAPS[e]=[t];_.push(t)}}},{key:"off",value:function(e,t){if(e){var _=this.MAPS[e];if(_){if(t)return _.splice(_.indexOf(t),1);_.length=0}}}},{key:"emit",value:function(e,t){if(e){var _=this.MAPS["*"];_&&_.length&&_.forEach(function(_){_(e,t)});var n=this.MAPS[e];n&&n.length&&n.forEach(function(e){e(t)})}}}]),e}();t.default=a},function(e,t,_){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t,_,n,a;n=e.length,t=new Uint8Array(3*n);var r=0;for(_=0;_<n;_++)a=e.charCodeAt(_),a>=1&&a<=127?t[r++]=a:a>2047?(t[r++]=224|a>>12&15,t[r++]=128|a>>6&63,t[r++]=128|a>>0&63):(t[r++]=192|a>>6&31,t[r++]=128|a>>0&63);return new Uint8Array(t.buffer,0,r)}function r(e){var t,_,n,a,r,o;for(t="",n=e.length,_=0;_<n;)switch(a=e[_++],a>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:t+=String.fromCharCode(a);break;case 12:case 13:r=e[_++],t+=String.fromCharCode((31&a)<<6|63&r);break;case 14:r=e[_++],o=e[_++],t+=String.fromCharCode((15&a)<<12|(63&r)<<6|(63&o)<<0)}return t}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",_=new Object;if(_.data_len=0,_.data="",_.name=e,"mov_start"==e)_.type=1;else if("mov_stop"==e)_.type=2;else if("mov_pause"==e){if(_.type=3,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("mov_resume"==e)_.type=4;else if("mov_seek"==e){if(_.type=5,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("ss_start"==e)_.type=6,_.data=a(t),_.data_len=_.data.length;else if("ss_stop"==e)_.type=7;else if("ss_version"==e)_.type=14;else if("get_mic"==e)_.type=26;else{if("ds_start"==e){_.type=27,_.data_len=536;var n=new ArrayBuffer(_.data_len),o=new Uint32Array(n,0,6);coordstr=t;var i=coordstr.split(",");if(4!=i.length)return;o[0]=parseInt(i[0]),o[1]=parseInt(i[1]),o[2]=parseInt(i[2]),o[3]=parseInt(i[3]);var s=new Uint8Array(n,24,256);window_name=t;for(var S=a(window_name),E=0;E<S.length;E++)s[E]=S[E];o[4]=S.length,o[5]=0;new Uint8Array(n,280,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}if("ds_stop"==e)_.type=28;else{if("aud_start"==e){_.type=29,_.data_len=520;var n=new ArrayBuffer(_.data_len),l=new Uint32Array(n,0,1),C=t;l[0]=C.length;var f=new Uint32Array(n,4,1);f[0]=0;for(var c=new Uint8Array(n,8,256),O=a(C),E=0;E<O.length;E++)c[E]=O[E];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}if("aud_stop"==e)_.type=30;else if("get_cam"==e)_.type=41;else{if("cam_start"==e){_.type=42,_.data_len=520;var n=new ArrayBuffer(_.data_len),I=new Uint32Array(n,0,1),T=t;I[0]=T.length;var f=new Uint32Array(n,4,1);f[0]=0;for(var U=new Uint8Array(n,8,256),u=a(T),E=0;E<u.length;E++)U[E]=u[E];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}"cam_stop"==e?_.type=43:"set_videoparam"==e?(_.type=46,_.data=a(t),_.data_len=_.data.length):"get_videoparam"==e?(_.type=47,_.data=a(t),_.data_len=_.data.length):"start_record"==e?(_.type=48,_.data=a(t),_.data_len=_.data.length):"stop_record"==e?(_.type=49,_.data=a(t),_.data_len=_.data.length):"start_push"==e?(_.type=50,_.data=a(t),_.data_len=_.data.length):"stop_push"==e?(_.type=51,_.data=a(t),_.data_len=_.data.length):"get_rtmp_port"==e?_.type=52:"set_mic_vol"==e?(_.type=53,_.data=a(t),_.data_len=_.data.length):"get_mic_vol"==e&&(_.type=54)}}}A(_)}function A(e){var t=8+e.data_len,_=new ArrayBuffer(t),n=new Uint16Array(_,0,1),a=new Uint8Array(_,2,1),r=new Uint32Array(_,4,1);if(n[0]=e.type,a[0]=0,r[0]=e.data_len,e.data_len>0)for(var o=new Uint8Array(_,8,e.data_len),A=0;A<e.data_len;A++)o[A]=e.data[A];R&&R.send(_)}function i(){try{R&&(R.close(),R=R.onopen=R.onclose=R.onerror=R.onmessage=null,C.emit(C.CLOSE))}catch(e){console.log(e)}}function s(){i()}function S(){R&&i(),R=new WebSocket("ws://"+p+":"+L),g=setTimeout(function(){clearTimeout(g),i()},1500),R.timeout=1500,R.binaryType="arraybuffer",R.onopen=function(){clearTimeout(g),o("get_rtmp_port"),o("get_mic"),o("get_cam"),o("get_mic_vol"),C.emit(C.OPEN)},R.onclose=function(){i()},R.onerror=function(){i()},R.onmessage=function(e){var t=e.data;if("string"==typeof e.data)console.log("on message [string] ignore.");else{var _=new DataView(t),n=_.getUint16(0,!0);console.log("onmessage code->",n);var a=(_.getUint8(2,!0),_.getUint32(4,!0));if(n>=0&&n<f.length){f[n]}if(0==n||6==n||8==n)console.log("mov_start,mov_pause,mov_seek success");else if(10==n){if(a>36){var o=new Uint32Array(t,8,8),A="width:"+o[0]+" height:"+o[1];A="framerate:"+o[2]+" duration:"+o[3],A="playpos:"+o[4]+" filesize:"+o[5],c=A;var i=o[6],s=new Uint8Array(t,40,i),S=r(s);c.filename=S,C.emit(C.MOVIE_INFO_CHANGE,c)}}else if(11==n)console.log("ss_start success"),C.emit(C.SS_START);else if(24<=n&&26>=n){if(a>=4){var E=_.getUint32(8,!0);O=E.toString(),C.emit(C.VERSION_INFO_CHANGE,O)}}else if(55==n)console.log("ds_start success");else if(59==n)console.log("as start success");else if(83==n){if(console.log("get camera sucess"),a>4){var l=_.getUint32(8,!0),R=12;I.length=0;for(var p=0;p<l;p++){var L=_.getUint32(R,!0);R+=4;var g=new Uint8Array(t,R,L-1);R+=L;var y=r(g);I.push(y)}C.emit(C.CAMERA_INFO_CHANGE,I)}}else if(53==n){if(a>4){var v=_.getUint32(8,!0),R=12;T.length=0;for(var p=0;p<v;p++){var M=_.getUint32(R,!0);R+=4;var P=new Uint8Array(t,R,M-1);R+=M;var y=r(P);T.push(y)}C.emit(C.MIC_INFO_CHANGE,T)}}else if(85==n)console.log("cam_share success");else if(95==n){console.log("get_videoparam success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);U=y,C.emit(C.VIDEO_INFO_CHANGE,U)}else if(105==n){console.log("get_rtmp_port_success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);u=y,C.emit(C.RTMP_PORT_CHANGE,u)}else if(109==n){console.log("get_mic_vol success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);d=y,C.emit(C.MIC_VOL_CHANGE,d)}else if(111<=n&&114>=n){var N=new Uint8Array(t,8,t.byteLength-8),V=r(N);console.log("url->",V)}else if(13==n)C.emit(C.SS_STOP);else{var N=new Uint8Array(t,8,t.byteLength-8),y=r(N);console.log("data ->",y)}}}}Object.defineProperty(t,"__esModule",{value:!0});var E=_(1),l=n(E),C=new l.default,f=["MOV_START_SUC","MOV_START_FAIL","MOV_STOP_SUC","MOV_STOP_FAIL","MOV_PAUSE_SUC","MOV_PAUSE_FAIL","MOV_RESUME_SUC","MOV_RESUME_FAIL","MOV_SEEK_SUC","MOV_SEEK_FAIL","MOV_PROPERTY","SS_START_SUC","SS_START_FAIL","SS_STOP_SUC","SS_STOP_FAIL","REC_START_SUC","REC_START_FAIL","REC_STOP_SUC","REC_STOP_FAIL","REC_PAUSE_SUC","REC_PAUSE_FAIL","REC_RESUME_SUC","REC_RESUME_FAIL","MOV_PLAY_FINISH","MOV_VERSION","SS_VERSION","REC_VERSION","MOV_SELECT_FILE_CANCEL","QAV_LOGIN_SUC","QAV_LOGIN_FAIL","QAV_LOGOUT_SUC","QAV_LOGOUT_FAIL","QAV_ENTERROOM_SUC","QAV_ENTERROOM_FAIL","QAV_LEAVEROOM_SUC","QAV_LEAVEROOM_FAIL","QAV_OPEN_MIC_SUC","QAV_OPEN_MIC_FAIL","QAV_OPEN_MIC_NODEV","QAV_CLOSE_MIC_SUC","QAV_CLOSE_MIC_FAIL","QAV_CLOSE_MIC_NODEV","QAV_OPEN_PLAYER_SUC","QAV_OPEN_PLAYER_FAIL","QAV_OPEN_PLAYER_NODEV","QAV_CLOSE_PLAYER_SUC","QAV_CLOSE_PLAYER_FAIL","QAV_CLOSE_PLAYER_NODEV","QAV_MUTE_AUDIO_SUC","QAV_MUTE_AUDIO_FAIL","QAV_UNMUTE_AUDIO_SUC","QAV_UNMUTE_AUDIO_FAIL","REC_SAVE_FILE_CANCEL","GET_MIC_SUC","GET_MIC_FAIL","DS_START_SUC","DS_START_FAIL","DS_STOP_SUC","DS_STOP_FAIL","AUD_START_SUC","AUD_START_FAIL","AUD_STOP_SUC","AUD_STOP_FAIL","AUD_DATA","SS_DATA","MOV_DATA","PEN_START_SUC","PEN_START_FAIL","PEN_STOP_SUC","PEN_STOP_FAIL","PEN_VERSION","QAV_DEVICE_SUC","QAV_DEVICE_FAIL","CBD_QUERY_SUC","CBD_QUERY_FAIL","CBD_GET_SUC","CBD_GET_FAIL","FILE_GET_SUC","FILE_GET_FAIL","FILE_SET_SUC","FILE_SET_FAIL","RESTART_SUC","RESTART_FAIL","GET_CAM_SUC","GET_CAM_FAIL","CAM_START_SUC","CAM_START_FAIL","CAM_STOP_SUC","CAM_STOP_FAIL","SWITCH_SCENE_SUC","SWITCH_SCENE_FAIL","PUSH_STREAM_FAIL","SHOW_UI_SUC","SET_VIDEO_PARAM_SUC","SET_VIDEO_PARAM_FAIL","GET_VIDEO_PARAM_SUC","GET_VIDEO_PARAM_FAIL","START_RECORD_SUC","START_RECORD_FAIL","STOP_RECORD_SUC","STOP_RECORD_FAIL","START_PUSH_SUC","START_PUSH_FAIL","STOP_PUSH_SUC","STOP_PUSH_FAIL","GET_RTMP_PORT_SUC","GET_RTMP_PORT_FAIL","SET_MIC_VOL_SUC","SET_MIC_VOL_FAIL","GET_MIC_VOL_SUC","GET_MIC_VOL_FAIL","RTMP_CONNECTING","RTMP_CONNECT_SUC","RTMP_CONNECT_FAIL","RTMP_CONNECT_CLOSED"],c=null,O="",I=[],T=[],U="",u="",d="",R=null,p="127.0.0.1",L=8090,g=0;C.infos={movieInfo:c,versionInfo:O,cameraInfo:I,micInfo:T,videoInfo:U,rtmpPort:u,micVol:d},C.MOVIE_INFO_CHANGE="MOVIE_INFO_CHANGE",C.VERSION_INFO_CHANGE="VERSION_INFO_CHANGE",C.CAMERA_INFO_CHANGE="CAMERA_INFO_CHANGE",C.MIC_INFO_CHANGE="MIC_INFO_CHANGE",C.VIDEO_INFO_CHANGE="VIDEO_INFO_CHANGE",C.RTMP_PORT_CHANGE="RTMP_PORT_CHANGE",C.MIC_VOL_CHANGE="MIC_VOL_CHANGE",C.SS_START="SS_START",C.SS_STOP="SS_STOP",C.OPEN="OPEN",C.CLOSE="CLOSE",C.ERROR="ERROR",C.getRTMPPort=function(){o("get_rtmp_port")},C.getMicInfo=function(){o("get_mic")},C.getCamInfo=function(){o("get_cam")},C.getMicVol=function(){o("get_mic_vol")},C.start=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"127.0.0.1",t=arguments[1];p=e,L=t,S()},C.stop=function(){s()},C.startShareScreen=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";o("ss_start",e)},C.stopShareScreen=function(){o("ss_stop")},t.default=C}])});
\ No newline at end of file
... ...