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
李勇
7 years ago
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
64c7a3f18a4521aeca303a9b8c6536ec9150a841
64c7a3f1
1 parent
ed3e98bf
webRtc-dev
...
ly20171204-1w
ly20171208-1w
ly20171211-1w
ly20171211-2w
ly20171214-1w
v2.38.13.20171216
v2.38.11.20171214
v2.38.3.201712011
v2.38.1.201712011
v2.36.11.20171204
v2.36.8.20171206
1.视频模块修复同步更新消息时nodeId不正确的问题;2.新增video模块由于频道占用问题导致推流消息不能同步,回放时缺少消息的问题,使用广播消息来匹配;3.修复webrtc视频界面名字显示
隐藏空白字符变更
内嵌
并排对比
正在显示
7 个修改的文件
包含
69 行增加
和
30 行删除
src/EngineEntrance.js
src/EverSocket.js
src/RecordInfoMatch.js
src/RecordPlayBackParse.js
src/apes/VideoApe.js
src/apes/WebRtcApe.js
src/mcu.js
src/EngineEntrance.js
查看文件 @
64c7a3f
...
...
@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super
();
this
.
lastClassActiveTime
=
0
;
//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig
.
sdkVersion
=
"v2.36.
4.20171201
"
;
GlobalConfig
.
sdkVersion
=
"v2.36.
11.20171204
"
;
loger
.
warn
(
"sdkVersion:"
+
GlobalConfig
.
sdkVersion
);
console
.
log
(
"sdkVersion:"
+
GlobalConfig
.
sdkVersion
);
//设置
...
...
@@ -801,6 +801,7 @@ export default class MessageEntrance extends Emiter {
//本地JOSN加载完成-获取IP信息完成
_getUserIpCallbackHandler
(
_data
)
{
//获取IP信息,返回一次就不再处理
loger
.
log
(
"获取IP信息返回->"
,
_data
);
if
(
this
.
isGetUserIpCallback
)
{
return
;
}
...
...
src/EverSocket.js
查看文件 @
64c7a3f
...
...
@@ -164,14 +164,14 @@ class EverSocket extends Emiter {
}
_clear
()
{
loger
.
log
(
'WebSocket
,
Timers销毁'
);
loger
.
log
(
'WebSocket
-
Timers销毁'
);
window
.
clearInterval
(
this
.
pingTimer
);
window
.
clearInterval
(
this
.
pongTimer
);
window
.
clearInterval
(
this
.
reConnectionTimeout
);
this
.
_setConnected
(
false
);
//先设置状态
this
.
_enableEverSocket
=
false
;
if
(
this
.
websocket
==
null
)
{
loger
.
log
(
'WebSocket,Timers已经销毁'
);
//
loger.log('WebSocket,Timers已经销毁');
return
;
}
this
.
websocket
.
onopen
=
undefined
;
...
...
@@ -188,7 +188,7 @@ class EverSocket extends Emiter {
}
_clearHistory
()
{
loger
.
log
(
'WebSocket->清除记录'
);
//
loger.log('WebSocket->清除记录');
window
.
clearInterval
(
this
.
pingTimer
);
window
.
clearInterval
(
this
.
pongTimer
);
window
.
clearInterval
(
this
.
reConnectionTimeout
);
...
...
@@ -196,7 +196,7 @@ class EverSocket extends Emiter {
this
.
_connected
=
false
;
this
.
_enableEverSocket
=
false
;
if
(
this
.
websocket
==
null
)
{
loger
.
log
(
'WebSocket->已经销毁'
);
//
loger.log('WebSocket->已经销毁');
return
;
}
this
.
websocket
.
onopen
=
undefined
;
...
...
@@ -212,7 +212,7 @@ class EverSocket extends Emiter {
}
_onOpen
()
{
loger
.
log
(
'
WebSocket建立
成功'
,
this
.
wsURL
);
loger
.
log
(
'
MCU连接
成功'
,
this
.
wsURL
);
this
.
reConnectionCounter
=
0
;
this
.
mcuReconnectCounter
=
0
;
...
...
@@ -224,12 +224,12 @@ class EverSocket extends Emiter {
}
_onClose
(
closeEvent
)
{
loger
.
log
(
`
WebSocket
连接断开
CODE
:
$
{
closeEvent
.
code
}
REASON
:
$
{
closeEvent
.
reason
}
CLEAN
:
$
{
closeEvent
.
wasClean
}
`
,
this
.
wsURL
);
loger
.
log
(
`
MCU
连接断开
-
CODE
:
$
{
closeEvent
.
code
}
REASON
:
$
{
closeEvent
.
reason
}
CLEAN
:
$
{
closeEvent
.
wasClean
}
`
,
this
.
wsURL
);
this
.
_reConnection
();
}
_onError
()
{
loger
.
log
(
'WebSocket
错误出现
'
);
loger
.
log
(
'WebSocket
->ERROR->准备重连
'
);
this
.
_connected
=
false
;
this
.
_reConnection
();
}
...
...
@@ -264,7 +264,7 @@ class EverSocket extends Emiter {
)
{
}
else
{
loger
.
warn
(
'
---服务器PINGPONG超时-----'
);
loger
.
warn
(
'
服务器PINGPONG超时->准备重连'
,
"lastActiveTime:"
+
this
.
_lastActiveTime
,
"pongTime:"
+
pongTime
);
this
.
_reConnection
();
}
}
...
...
src/RecordInfoMatch.js
查看文件 @
64c7a3f
...
...
@@ -246,10 +246,10 @@ class RecordInfoMatch extends Emiter {
this
.
matchForUid
(
k
,
_recordMessages
[
k
],
_m3u8jsonDataList
[
k
]);
}
console
.
log
(
"
unMatchUid
"
,
this
.
matchStreams
);
console
.
log
(
"
matchStreams
"
,
this
.
matchStreams
);
console
.
log
(
"_recordMessages"
,
_recordMessages
);
console
.
log
(
"_m3u8jsonDataList"
,
_m3u8jsonDataList
);
console
.
log
(
"最终匹配完成的数量为->"
+
Object
.
keys
(
this
.
matchStreams
).
length
,
"未匹配成功的数量为->"
+
(
this
.
streamInfoLen
-
parseInt
(
Object
.
keys
(
this
.
matchStreams
).
length
))
);
console
.
log
(
"最终匹配完成的数量为->"
+
Object
.
keys
(
this
.
matchStreams
).
length
);
console
.
log
(
"没有录制文件的用户"
,
this
.
unMatchUid
);
this
.
_emit
(
RecordInfoMatch
.
RECORD_INFO_MATCH_COMPLETE
,
this
.
matchStreams
);
}
...
...
@@ -317,22 +317,22 @@ class RecordInfoMatch extends Emiter {
if
(
uidRecordInfoArr
.
length
!=
uidRecordFileArr
.
length
&&
uidRecordFileArr
.
length
>
0
&&
uidRecordInfoArr
.
length
>
0
)
{
console
.
log
(
k
+
"->数量不同 消息数量:"
+
uidRecordInfoArr
.
length
,
"视频数量:"
+
uidRecordFileArr
.
length
);
//按消息的数量大于视频数量处理
let
lastFileItem
;
//记录最后一个
let
last
Video
FileItem
;
//记录最后一个
for
(
let
h
=
0
;
h
<
uidRecordInfoArr
.
length
;
h
++
)
{
let
infoItem
=
uidRecordInfoArr
[
h
];
let
fileItem
=
uidRecordFileArr
[
h
];
if
(
fileItem
)
{
infoItem
.
video_url
=
fileItem
.
video_url
;
let
videoFileItem
=
uidRecordFileArr
[
h
];
if
(
videoFileItem
)
{
infoItem
.
video_url
=
videoFileItem
.
video_url
;
//如果之前没有匹配到才设置
if
(
!
this
.
matchStreams
[
infoItem
.
stream_id
])
{
this
.
matchStreams
[
infoItem
.
stream_id
]
=
infoItem
;
}
lastFileItem
=
infoItem
;
//记录最后一个文件的数据
last
Video
FileItem
=
infoItem
;
//记录最后一个文件的数据
}
else
{
if
(
lastFileItem
)
{
infoItem
.
video_url
=
lastFileItem
.
video_url
;
infoItem
.
seek
=
parseInt
(
infoItem
.
creatTimeUTC
)
-
parseInt
(
lastFileItem
.
creatTimeUTC
);
if
(
lastVideoFileItem
)
{
infoItem
.
video_url
=
lastVideoFileItem
.
video_url
;
infoItem
.
seek
=
parseInt
(
infoItem
.
creatTimeUTC
)
-
parseInt
(
lastVideoFileItem
.
creatTimeUTC
);
if
(
!
this
.
matchStreams
[
infoItem
.
stream_id
])
{
this
.
matchStreams
[
infoItem
.
stream_id
]
=
infoItem
;
}
...
...
src/RecordPlayBackParse.js
查看文件 @
64c7a3f
...
...
@@ -282,6 +282,7 @@ class RecordPlayBackParse extends Emiter {
this
.
_searchMessageFromTime
(
this
.
_recordPlaybackTimestamp
,
this
.
_whiteApeMssages
,
"whiteApe"
);
this
.
_searchMessageFromTime
(
this
.
_recordPlaybackTimestamp
,
this
.
_videoApeMssages
,
"videoAp"
);
this
.
_searchMessageFromTime
(
this
.
_recordPlaybackTimestamp
,
this
.
_audioApeMssages
,
"audioApe"
);
this
.
_searchMessageFromTime
(
this
.
_recordPlaybackTimestamp
,
this
.
_videoApeBroadcastMssages
,
"videoApBroadcast"
);
}
//加载录制文件rec
...
...
@@ -864,8 +865,12 @@ class RecordPlayBackParse extends Emiter {
//this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID);
*/
//先查广播消息再查频道消息,频道消息在广播消息之后
//视频广播消息
this
.
searchVideoBroadcastMessageKeyfram
(
this
.
_videoApeBroadcastMssages
);
//音视频模块的查找规则和其他模块不一样,音视频按频道查找,如果课堂内存在多个频道,都要查
this
.
searchMediaApeMessageKeyfram
(
this
.
mediaChannleList
);
//this.searchMediaApeMessageKeyfram(this.mediaChannleList);
//媒体共享模块
this
.
searchMediaShareApeMessageKeyfram
(
this
.
_mediaShareApeMssages
);
...
...
@@ -935,6 +940,31 @@ class RecordPlayBackParse extends Emiter {
}
}
//视频广播消息查找关键帧时间戳的消息
searchVideoBroadcastMessageKeyfram
(
_apeMessages
)
{
if
(
!
_apeMessages
)
{
return
;
}
console
.
log
(
'SEEK->查找音视频模块广播数据'
,
_apeMessages
)
if
(
_apeMessages
)
{
for
(
let
k
in
_apeMessages
)
{
let
nodeIdVideoBrodcast
=
_apeMessages
[
k
];
let
messageItem
;
let
keyFrameSeekTime
=
0
;
for
(
let
i
=
this
.
_recordPlaybackTimestamp
;
i
>
0
;
i
--
)
{
messageItem
=
nodeIdVideoBrodcast
[
i
];
if
(
messageItem
)
{
keyFrameSeekTime
=
(
this
.
_recordPlaybackTimestamp
-
i
);
loger
.
log
(
"nodeId:"
+
k
+
"->SEEK->查找音视频模块广播数据->"
,
messageItem
,
'keyFrameSeekTime->'
,
keyFrameSeekTime
)
this
.
_everSocketMsgReceivedHandler
(
messageItem
.
byteData
,
keyFrameSeekTime
);
break
;
}
}
// loger.log("nodeId:" + k + "—>没有查找到数据")
}
}
}
//媒体共享模块查找关键帧时间戳的消息
searchMediaShareApeMessageKeyfram
(
_apeMessages
)
{
if
(
!
_apeMessages
)
{
...
...
@@ -1080,6 +1110,12 @@ class RecordPlayBackParse extends Emiter {
},.....
}*/
if
(
videoReceivePdu
.
data
.
status
==
1
){
let
videoChannelInfo
=
videoReceivePdu
.
data
;
videoChannelInfo
.
creatTime
=
videoChannelInfo
.
timestamp
;
this
.
videoPublishMessages
.
push
(
videoChannelInfo
);
}
this
.
_videoApeBroadcastMssages
[
videoReceivePdu
.
fromNodeId
][
timestamp
]
=
{
parseData
:
videoReceivePdu
,
byteData
:
data
,
...
...
@@ -1218,7 +1254,7 @@ class RecordPlayBackParse extends Emiter {
if
(
sessionId
==
ApeConsts
.
VIDEO_SESSION_ID
)
{
try
{
let
videoChannelInfo
=
pdu
[
'RCVideoChannelInfoPdu'
].
decode
(
tableItem
.
itemData
);
loger
.
log
(
'RCVideoChannelInfoPdu->timestamp'
,
timestamp
,
videoChannelInfo
);
//
loger.log('RCVideoChannelInfoPdu->timestamp',timestamp,videoChannelInfo);
//储存音视频模块的数据
if
(
!
this
.
mediaChannleList
[
videoChannelInfo
.
channelId
])
{
this
.
mediaChannleList
[
videoChannelInfo
.
channelId
]
=
{};
...
...
src/apes/VideoApe.js
查看文件 @
64c7a3f
...
...
@@ -570,6 +570,7 @@ class VideoApe extends Ape {
//录制回放和H5需要处理
if
(
GlobalConfig
.
isRecordPlayBack
){
//录制回放的处理
console
.
log
(
"录制回放的处理视频模块控制消息->"
,
videoReceivePdu
);
if
(
videoReceivePdu
.
toNodeId
!=
0
){
//只处理发送给所有人的消息,发给指定人的消息不处理
return
;
...
...
@@ -588,25 +589,24 @@ class VideoApe extends Ape {
"timestamp": 1505886364100,
"recordTimestamp": 27
}*/
/*
switch (videoReceivePdu.actionType){
switch
(
videoReceivePdu
.
actionType
){
case
ApeConsts
.
MEDIA_ACTION_PUBLISH_STATUS
:
//webRtc的推流和停止推流的消息
let
videoInfo
=
{};
let
videoData
=
data
;
videoData.streamId=data.channel+"_"+data.userId+"_"+data.uid+"_"+(parseInt(parseInt(data.timestamp)/1000));
if
(
data
.
status
==
1
){
loger.log("播放文件->",
"userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString()
);
loger
.
log
(
"播放文件->"
,
videoData
);
videoInfo
=
this
.
packVideoInfoAndSendToClient
(
videoData
,
seek
);
this
.
_emit
(
MessageTypes
.
VIDEO_PLAY
,
videoInfo
);
}
else
if
(
data
.
status
==
0
){
loger.log("停止播放文件->",
"userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString()
);
loger
.
log
(
"停止播放文件->"
,
videoData
);
videoInfo
=
this
.
packVideoInfoAndSendToClient
(
videoData
,
seek
);
this
.
_emit
(
MessageTypes
.
VIDEO_STOP
,
videoInfo
);
}
break
;
default
:
break
}
*/
}
}
else
{
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
...
...
@@ -835,6 +835,7 @@ class VideoApe extends Ape {
for
(
let
i
in
this
.
mediaModule
.
mediaChannels
)
{
let
channelInfo
=
this
.
mediaModule
.
mediaChannels
[
i
];
if
(
channelInfo
)
{
channelInfo
.
nodeId
=
channelInfo
.
fromNodeId
;
//发送消息的人员nodeId
if
(
channelInfo
.
status
==
ApeConsts
.
CHANNEL_STATUS_RELEASED
)
{
channelInfo
.
owner
=
0
;
}
else
{
...
...
@@ -877,7 +878,7 @@ class VideoApe extends Ape {
packPduModel
.
userId
=
_param
.
userId
||
"0"
;
packPduModel
.
mediaType
=
_param
.
mediaType
||
ApeConsts
.
MEDIA_TYPE_VIDEO
;
packPduModel
.
timestamp
=
_param
.
timestamp
||
0
;
packPduModel
.
fromNodeId
=
_param
.
nodeId
||
GlobalConfig
.
nodeId
;
packPduModel
.
fromNodeId
=
_param
.
nodeId
||
_param
.
fromNodeId
||
GlobalConfig
.
nodeId
;
packPduModel
.
userName
=
_param
.
userName
||
GlobalConfig
.
userName
;
packPduModel
.
toNodeId
=
0
;
packPduModel
.
userRole
=
_param
.
userRole
||
GlobalConfig
.
userRole
;
...
...
@@ -885,12 +886,12 @@ class VideoApe extends Ape {
packPduModel
.
screenHeight
=
_param
.
screenHeight
||
GlobalConfig
.
screenHeight
;
packPduModel
.
deviceType
=
_param
.
deviceType
||
GlobalConfig
.
deviceType
;
packPduModel
.
optionJsonData
=
GlobalConfig
.
optionJsonData
;
loger
.
log
(
'packPdu->'
,
packPduModel
);
loger
.
log
(
'packPdu-
--------------
>'
,
packPduModel
);
return
packPduModel
;
}
unPackPdu
(
owner
,
itemIdx
,
itemData
)
{
loger
.
log
(
"unPackPdu->owner:"
,
owner
,
"itemIdx->"
,
itemIdx
);
loger
.
log
(
"unPackPdu-
-------------
>owner:"
,
owner
,
"itemIdx->"
,
itemIdx
);
if
(
owner
==
null
||
itemIdx
==
null
||
itemData
==
null
)
{
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_APE_INTERFACE_PARAM_WRONG
);
return
null
;
...
...
src/apes/WebRtcApe.js
查看文件 @
64c7a3f
...
...
@@ -718,6 +718,7 @@ class WebRtcApe extends Emiter {
updateAllVideoSize
()
{
$
(
"."
+
this
.
localWebRtcVideoClass
).
css
(
"width"
,
this
.
localVideoWidth
*
this
.
videoScale
);
$
(
"."
+
this
.
localWebRtcVideoClass
).
css
(
"height"
,
this
.
localVideoHeight
*
this
.
videoScale
);
$
(
"#videoOwnerName_"
+
this
.
uid
).
css
(
"width"
,
this
.
localVideoWidth
*
this
.
videoScale
);
$
(
"."
+
this
.
hostWebRtcVideoClass
).
css
(
"width"
,
this
.
hostRemoteVideoWidth
*
this
.
videoScale
);
$
(
"."
+
this
.
hostWebRtcVideoClass
).
css
(
"height"
,
this
.
hostRemoteVideoHeight
*
this
.
videoScale
);
...
...
src/mcu.js
查看文件 @
64c7a3f
...
...
@@ -206,7 +206,7 @@ class MCU extends Emiter {
// 主动断开MCU连接
leaveMCU
()
{
loger
.
log
(
'
leaveMCU
'
);
loger
.
log
(
'
断开MCU连接
'
);
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
GlobalConfig
.
classJoinSuccess
=
false
;
if
(
this
.
_everSocket
){
...
...
请
注册
或
登录
后发表评论