Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
李勇
/
McuClient
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
李勇
2017-02-18 17:17:54 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
d725521b3090ef9e4ac57448d9758c09551b336f
d725521b
1 parent
72f1888b
1.视频模块增加控制消息指令接口,定义控制消息的类型;增加控制消息监听的定义
2.修改时间戳生成和唯一nodeId生成的方法
隐藏空白字符变更
内嵌
并排对比
正在显示
10 个修改的文件
包含
87 行增加
和
60 行删除
src/EngineEntrance.js
src/EngineUtils.js
src/MessageTypes.js
src/apes/ApeConsts.js
src/apes/ConferApe.js
src/apes/DocApe.js
src/apes/VideoApe.js
src/apes/WhiteBoardApe.js
src/mcu.js
src/pdus/pro.js
src/EngineEntrance.js
查看文件 @
d725521
...
...
@@ -84,6 +84,12 @@ export default class MessageEntrance extends Emiter {
_video_ape
=
new
VideoApe
();
_video_ape
.
on
(
'*'
,
(
type
,
data
)
=>
this
.
_emit
(
type
,
data
));
_video_ape
.
on
(
MessageTypes
.
VIDEO_UPDATE
,
this
.
videoUpdate
.
bind
(
this
));
_whiteboard_ape
=
new
WhiteBoardApe
();
_whiteboard_ape
.
on
(
'*'
,
(
type
,
data
)
=>
this
.
_emit
(
type
,
data
));
//_whiteboard_ape.on(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
_doc_ape
=
new
DocApe
();
_doc_ape
.
on
(
'*'
,
(
type
,
data
)
=>
this
.
_emit
(
type
,
data
));
...
...
@@ -92,10 +98,6 @@ export default class MessageEntrance extends Emiter {
_doc_ape
.
on
(
DocApe
.
DOC_JOIN_CHANNEL_SUCCESS
,
this
.
docJoinChannelSuccess
.
bind
(
this
));
_whiteboard_ape
=
new
WhiteBoardApe
();
_whiteboard_ape
.
on
(
'*'
,
(
type
,
data
)
=>
this
.
_emit
(
type
,
data
));
//_whiteboard_ape.on(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
//公开外部调用的方法
//class
...
...
@@ -622,6 +624,13 @@ export default class MessageEntrance extends Emiter {
}
//VidoeApe
videoUpdate
(
_data
){
//视频同步的消息发送改变,需要通知ferApe模块中的用户更新状态
if
(
_confer_ape
){
_confer_ape
.
updaterRosterStatus
(
_data
);
}
}
sendVideoCommandMsg
(
_param
){
if
(
_video_ape
){
_video_ape
.
sendVideoCommandMsg
(
_param
);
...
...
@@ -687,7 +696,6 @@ export default class MessageEntrance extends Emiter {
//DocApe
//获取文档完整路径
_getDocFullPath
(
_param
){
if
(
_doc_ape
){
...
...
src/EngineUtils.js
查看文件 @
d725521
...
...
@@ -29,11 +29,17 @@ class EngineUtils{
}
//生成时间戳后9位 保证唯一
static
creatTimestamp
(){
static
creat
SoleNumberFrom
Timestamp
(){
let
time
=
new
Date
().
getTime
();
let
timestamp
:
int
=
time
%
1000000000
;
//time后9位
return
timestamp
;
}
//生成时间戳毫秒
static
creatTimestamp
(){
let
time
=
parseInt
(
new
Date
().
getTime
()
/
1000
);
//精确到毫秒
return
time
;
}
//生成时间戳 string
static
creatTimestampStr
(){
let
curTime
=
new
Date
();
...
...
src/MessageTypes.js
查看文件 @
d725521
...
...
@@ -26,8 +26,8 @@ MessageTypes.CLASS_STATUS_INFO_CHANGE= 'class.status.info.change';//会议状态
MessageTypes
.
CHAT_RECEIVE
=
'chat.receive'
;
//视频模块事件定义
MessageTypes
.
VIDEO_RECEIVE
=
'video.receive'
;
MessageTypes
.
VIDEO_UPDATE
=
'video.update'
;
MessageTypes
.
VIDEO_COMMAND
=
'video.command'
;
//文档模块事件定义
MessageTypes
.
DOC_DELETE
=
'document.delete'
;
//删除文档
...
...
src/apes/ApeConsts.js
查看文件 @
d725521
...
...
@@ -69,17 +69,22 @@ ApeConsts.USER_MIC_OPEN = 0x0040; // 麦克风开启
ApeConsts
.
USER_CAMERA_OPEN
=
0x0080
;
// 视频开启
//VIDEO MIC
ApeConsts
.
OPEN_CAMERA
=
"open.camera"
;
ApeConsts
.
CLOSE_CAMERA
=
"close.camera"
;
ApeConsts
.
OPEN_MIC
=
"open.mic"
;
ApeConsts
.
CLOSE_MIC
=
"close.mic"
;
//VIDEO MIC 流媒体消息操作控制类型
ApeConsts
.
MEDIA_ACTION_DEFAULT
=
0
;
ApeConsts
.
MEDIA_ACTION_OPEN_CAMERA
=
1
;
// "open.camera";
ApeConsts
.
MEDIA_ACTION_CLOSE_CAMERA
=
2
;
// "close.camera";
ApeConsts
.
MEDIA_ACTION_OPEN_MIC
=
3
;
//"open.mic";
ApeConsts
.
MEDIA_ACTION_CLOSE_MIC
=
4
;
//"close.mic";
// VIDEO AUDIO CHANNEL使用状态
ApeConsts
.
CHANNEL_STATUS_RELEASED
=
0
;
///< 无人占用状态
ApeConsts
.
CHANNEL_STATUS_OPENING
=
1
;
///< 已经占用成功
//媒体类型
ApeConsts
.
MEDIA_TYPE_DEFAULT
=
0
;
//没有类型
ApeConsts
.
MEDIA_TYPE_VIDEO
=
1
;
//视频流(包含音频)
ApeConsts
.
MEDIA_TYPE_VIDEO
=
2
;
//音频流
//FLASH中使用下面4个
ApeConsts
.
CGS_RELEASED
=
0
;
///< 无人占用状态
...
...
src/apes/ConferApe.js
查看文件 @
d725521
...
...
@@ -70,7 +70,6 @@ class ConferApe extends Ape {
let
userDataPdu
=
new
pdu
[
'RCNodeInfoUserDataPdu'
];
userDataPdu
.
qq
=
''
;
userDataPdu
.
skype
=
''
;
userDataPdu
.
mobile
=
''
;
nodeInfoRecordPdu
.
userData
=
userDataPdu
.
toArrayBuffer
();
nodeInfoRecordPdu
.
deviceType
=
GlobalConfig
.
deviceType
;
//设备类型
...
...
@@ -100,7 +99,7 @@ class ConferApe extends Ape {
}
sendConferMsg
(
_messageInfo
)
{
if
(
this
.
_classInfo
==
=
null
||
EngineUtils
.
isEmptyObject
(
this
.
_classInfo
)){
if
(
this
.
_classInfo
==
null
||
EngineUtils
.
isEmptyObject
(
this
.
_classInfo
)){
loger
.
log
(
'不能发送会议消息.McuClient还未初始化数据!'
);
if
(
GlobalConfig
.
getCurrentStatus
().
code
==
0
||
GlobalConfig
.
getCurrentStatus
().
code
==
1
){
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_APE_SEND_FAILED_NO_JOIN
);
...
...
@@ -454,6 +453,11 @@ class ConferApe extends Ape {
}
}
//视频模块发生更新,人员状态需要更新
updaterRosterStatus
(
_param
){
loger
.
log
(
"视频模块发生更新,人员状态需要更新"
,
_param
);
//如果是自己。改变自己的状态同步到MCU
}
//删除用户
rosterDelHandler
(
nodeId
)
{
if
(
GlobalConfig
.
nodeId
==
nodeId
){
...
...
src/apes/DocApe.js
查看文件 @
d725521
...
...
@@ -58,7 +58,7 @@ class DocApe extends Ape {
return
;
}
itemIdx
=
EngineUtils
.
creatTimestamp
();
itemIdx
=
EngineUtils
.
creat
SoleNumberFrom
Timestamp
();
let
docDataModelPdu
=
this
.
packPdu
(
paramInfo
,
itemIdx
);
if
(
docDataModelPdu
==
null
){
loger
.
log
(
'documentUpload失败,参数错误'
);
...
...
src/apes/VideoApe.js
查看文件 @
d725521
...
...
@@ -35,9 +35,6 @@ class VideoChat extends Ape {
//Attributes
this
.
videoChannels
=
{};
this
.
activeChannelId
=
0
;
this
.
activeURL
=
''
;
// Ape Models
this
.
registerKey
(
this
.
_session_id
,
this
.
_session_name
,
this
.
_session_tag
,
new
ArrayBuffer
);
...
...
@@ -168,7 +165,7 @@ class VideoChat extends Ape {
//return openedUsers;
}
sendVideoCommandMsg
(
_
messageInfo
)
{
sendVideoCommandMsg
(
_
param
)
{
if
(
this
.
_classInfo
===
null
||
EngineUtils
.
isEmptyObject
(
this
.
_classInfo
)){
loger
.
log
(
'不能发送Video消息.McuClient还未初始化数据!'
);
if
(
GlobalConfig
.
getCurrentStatus
().
code
==
0
||
GlobalConfig
.
getCurrentStatus
().
code
==
1
){
...
...
@@ -178,27 +175,27 @@ class VideoChat extends Ape {
return
;
}
// to, message
loger
.
log
(
'发送Video消息.'
,
_
messageInfo
);
loger
.
log
(
'发送Video消息.'
,
_
param
);
/* message RCVideoSendDataRequestPdu {
optional uint32 initiator = 1;
optional bool key_frame = 2;
optional uint32 sequence_id = 3;
optional uint32 slice_id = 4;
optional bytes user_data = 5;
}
*/
/* message RCVideoSendDataRequestPdu {
required uint32 from_node_id = 1;//发起人
optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收
optional uint32 actionType = 3;//消息指令类型;
optional bytes data = 4;//其他数据,这个根据actionType来确定数据的结构
}*/
let
videoSendPdu
=
new
pdu
[
'RCVideoSendDataRequestPdu'
];
videoSendPdu
.
type
=
pdu
.
RCPDU_VIDEO_SEND_DATA_REQUEST
;
videoSendPdu
.
initiator
=
GlobalConfig
.
nodeId
;
//发起人
videoSendPdu
.
peer
=
parseInt
(
_messageInfo
.
to
);
//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
videoSendPdu
.
userData
=
this
.
_rCArrayBufferUtil
.
strToUint8Array
(
"h5"
+
_messageInfo
.
message
);
//开头两个字会乱码
videoSendPdu
.
isPublic
=
true
;
videoSendPdu
.
sliceId
=
_messageInfo
.
sliceId
||
0
;
if
(
!
videoSendPdu
.
isPublic
&&
0
!=
videoSendPdu
.
peer
)
{
videoSendPdu
.
fromNodeId
=
GlobalConfig
.
nodeId
;
//发起人
videoSendPdu
.
toNodeId
=
parseInt
(
_param
.
toNodeID
)
||
0
;
//接收者,0就是所有人
videoSendPdu
.
actionType
=
parseInt
(
_param
.
actionType
)
||
ApeConsts
.
MEDIA_ACTION_DEFAULT
;
videoSendPdu
.
data
=
this
.
_rCArrayBufferUtil
.
strToUint8Array
(
"h5"
+
_param
.
data
);
//开头两个字会乱码
if
(
!
videoSendPdu
.
isPublic
&&
0
!=
videoSendPdu
.
toNodeId
)
{
//发送给制定的人
loger
.
log
(
'发送私聊Video消息.'
);
this
.
send
(
videoSendPdu
);
...
...
@@ -253,20 +250,22 @@ class VideoChat extends Ape {
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
// 视频消息处理
videoCommandHandler
(
videoBuffer
)
{
let
videoReceivePdu
=
pdu
[
'RCVideoSendDataRequestPdu'
].
decode
(
videoBuffer
);
let
video_data
=
{
};
video_data
.
_initiator
=
videoReceivePdu
.
initiator
;
video_data
.
_is_key_frame
=
videoReceivePdu
.
keyFrame
;
video_data
.
_sequence_id
=
videoReceivePdu
.
sequenceId
;
video_data
.
_slice_id
=
videoReceivePdu
.
sliceId
;
video_data
.
_data
=
videoReceivePdu
.
userData
;
// this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
loger
.
log
(
'视频消息处理 videoCommandHandler.'
,
video_data
);
//this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
// 视频消息处理,内部处理,不需要告诉应用层
videoCommandHandler
(
_data
)
{
let
videoReceivePdu
=
pdu
[
'RCVideoSendDataRequestPdu'
].
decode
(
_data
);
if
(
videoReceivePdu
==
null
)
{
loger
.
warn
(
"视频消息处理,收到的消息为null,不做处理"
);
return
;
}
videoReceivePdu
.
data
=
this
.
_rCArrayBufferUtil
.
uint8ArrayToStr
(
videoReceivePdu
.
data
,
2
);
//开头两个字会乱码
loger
.
log
(
'视频消息处理 videoCommandHandler.'
,
videoReceivePdu
);
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
if
(
videoReceivePdu
.
toNodeId
!=
0
&&
videoReceivePdu
.
toNodeId
!=
GlobalConfig
.
nodeId
){
loger
.
log
(
'视频消息不处理 toNodeId='
,
videoReceivePdu
.
toNodeId
,
"my nodeId="
,
GlobalConfig
.
nodeId
);
}
else
{
this
.
_emit
(
MessageTypes
.
VIDEO_COMMAND
,
videoReceivePdu
);
}
}
tableUpdateHandler
(
owner
,
itemIdx
,
itemData
)
{
...
...
@@ -278,6 +277,7 @@ class VideoChat extends Ape {
//loger.log('视频消息处理 tableUpdateHandler.',videoChannelInfo);
this
.
videoChannels
[
itemIdx
]
=
videoChannelInfo
;
this
.
_emit
(
MessageTypes
.
VIDEO_UPDATE
,
videoChannelInfo
);
/* switch (videoChannelInfo.status) {
case ApeConsts.CHANNEL_STATUS_RELEASED:
// 只能关闭自己的流
...
...
@@ -306,7 +306,7 @@ class VideoChat extends Ape {
}
emitVideoChange
()
{
this
.
_emit
(
MessageTypes
.
VIDEO_
RECEIV
E
,
{
this
.
_emit
(
MessageTypes
.
VIDEO_
UPDAT
E
,
{
activeChannelId
:
this
.
activeChannelId
,
HLSURL
:
this
.
activeURL
,
});
...
...
@@ -334,6 +334,7 @@ class VideoChat extends Ape {
let
packPduModel
=
new
pdu
[
'RCVideoChannelInfoPdu'
];
packPduModel
.
status
=
ApeConsts
.
CHANNEL_STATUS_OPENING
;
packPduModel
.
channelId
=
_itemIdx
;
packPduModel
.
mediaType
=
ApeConsts
.
MEDIA_TYPE_VIDEO
;
packPduModel
.
timestamp
=
EngineUtils
.
creatTimestamp
();
packPduModel
.
fromNodeId
=
GlobalConfig
.
nodeId
;
packPduModel
.
toNodeId
=
0
;
...
...
src/apes/WhiteBoardApe.js
查看文件 @
d725521
...
...
@@ -69,7 +69,7 @@ class WhiteBoardApe extends Ape {
return
;
}
itemIdx
=
EngineUtils
.
creatTimestamp
();
itemIdx
=
EngineUtils
.
creat
SoleNumberFrom
Timestamp
();
let
whiteBoardModelPdu
=
this
.
packPdu
(
_param
,
itemIdx
);
if
(
whiteBoardModelPdu
==
null
){
loger
.
log
(
'sendInsetAnnotaion失败,参数错误'
);
...
...
src/mcu.js
查看文件 @
d725521
...
...
@@ -166,7 +166,7 @@ class MCU extends Emiter {
_classInfo
.
classId
=
parseInt
(
_classInfo
.
classId
);
// classId 必须整形
this
.
classInfo
=
_classInfo
;
// 创建刷新nodeId
this
.
classInfo
.
nodeId
=
EngineUtils
.
creatTimestamp
();
this
.
classInfo
.
nodeId
=
EngineUtils
.
creat
SoleNumberFrom
Timestamp
();
GlobalConfig
.
nodeId
=
this
.
classInfo
.
nodeId
;
//这是标识自己身份的id
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
...
...
src/pdus/pro.js
查看文件 @
d725521
...
...
@@ -735,12 +735,10 @@ message RCAudioSendDataRequestPdu {
}
message
RCVideoSendDataRequestPdu
{
required
uint32
initiator
=
1
;
optional
bool
key_frame
=
2
;
optional
uint32
sequence_id
=
3
;
optional
uint32
slice_id
=
4
;
optional
bytes
user_data
=
5
;
optional
uint32
action
=
6
;
required
uint32
from_node_id
=
1
;
//发起人
optional
uint32
to_node_id
=
2
;
//接收人,如果是0就是所有人都接收
optional
uint32
actionType
=
3
;
//消息指令类型;
optional
bytes
data
=
4
;
//其他数据,这个根据actionType来确定数据的结构
}
message
RCAudioChannelInfoRecordPdu
{
...
...
@@ -757,6 +755,7 @@ message RCVideoChannelInfoPdu {
optional
uint32
timestamp
=
3
;
//更新的时间戳
optional
uint32
from_node_id
=
4
;
//发起者的id
optional
uint32
to_node_id
=
5
;
//接收者的id,(如果是0,所有人都接收)
optional
uint32
media_type
=
6
;
//媒体类型:视频(包含音频)或音频
}
message
RCVideoChannelInfoRecordPdu
{
...
...
@@ -835,10 +834,14 @@ message RCVotingPollRecordPdu {
}
message
RCNodeInfoUserDataPdu
{
optional
string
qq
=
1
;
optional
string
skype
=
2
;
optional
string
mobile
=
3
;
optional
string
device
=
1
;
//设备名称
optional
bool
has_camera
=
2
;
//是否有摄像头可用
optional
bool
has_microphone
=
3
;
//麦克风是否可用
optional
string
browser
=
4
;
//浏览器
optional
string
qq
=
5
;
//qq
optional
string
skype
=
6
;
//skype
}
message
RCTabUpdateDataRequestPdu
{
optional
uint32
id
=
1
;
optional
bytes
action
=
2
;
...
...
请
注册
或
登录
后发表评论