Skip to content

Commit 3571bc5

Browse files
committed
fixed:sdp whip change protocol and handle problem
1 parent 91ffa56 commit 3571bc5

File tree

8 files changed

+97
-50
lines changed

8 files changed

+97
-50
lines changed

XEngine_Release/XEngine_Config/XEngine_Config.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
{
22
"tszSMSUrl": "rtmp://app.xyry.org/live",
3-
"tszIPAddr": "10.0.1.88",
3+
"tszIPAddr": "10.0.4.69",
44
"bDeamon": 0,
55
"nRTMPPort": 1935,
66
"nHttpPort": 5600,
77
"nXStreamPort": 5601,
88
"nJT1078Port": 5602,
99
"nSrtPort": 5603,
10-
"nRTCPort": 5604,
10+
"nRTCWhepPort": 5604,
11+
"nRTCWhipPort": 5605,
1112
"XMax": {
1213
"nMaxClient": 10000,
1314
"nMaxQueue": 10000,
@@ -48,7 +49,7 @@
4849
"nARTCPPort": 56004
4950
},
5051
"RTC": {
51-
"bEnable": false,
52+
"bEnable": true,
5253
"bPrePull": false,
5354
"tszICEUser": "xengine",
5455
"tszICEPass": "3321308h8i6vt3769r6638l1409d50jz",
875 Bytes
Binary file not shown.

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientWebRtc.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,16 @@ bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
4444
}
4545
else
4646
{
47-
bool bRet = Cryption_Server_AcceptMemoryEx(xhRTCSsl, hSocket, lpszClientAddr, tszSDBuffer, &nSDLen, lpszMsgBuffer, nMsgLen);
47+
bool bRet = Cryption_Server_AcceptMemoryEx(xhRTCWhepSsl, hSocket, lpszClientAddr, tszSDBuffer, &nSDLen, lpszMsgBuffer, nMsgLen);
4848
if (nSDLen > 0)
4949
{
50-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTC);
50+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
5151
}
5252

5353
if (bRet)
5454
{
5555
XBYTE tszKEYBuffer[XPATH_MAX] = {};
56-
Cryption_Server_GetKeyEx(xhRTCSsl, lpszClientAddr, tszKEYBuffer);
56+
Cryption_Server_GetKeyEx(xhRTCWhepSsl, lpszClientAddr, tszKEYBuffer);
5757
ModuleHelp_SRTPCore_Create(tszKEYBuffer);
5858

5959
XCHAR tszSMSName[128] = {};
@@ -111,8 +111,8 @@ bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
111111
NatProtocol_StunNat_Packet(tszSDBuffer, &nSDLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_RESPONSE, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS, tszRVBuffer, true, st_ServiceConfig.st_XPull.st_PullWebRtc.tszICEPass, true);
112112
//更新绑定的地址
113113
ModuleSession_PullStream_RTCAddrSet(tszUserStr, lpszClientAddr);
114-
SocketOpt_HeartBeat_ActiveAddrEx(xhRTCHeart, tszUserStr); //激活一次心跳
115-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTC);
114+
SocketOpt_HeartBeat_ActiveAddrEx(xhRTCWhepHeart, tszUserStr); //激活一次心跳
115+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
116116
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,请求的STUN协议处理成功,请求的用户:%s"), lpszClientAddr, tszUserStr);
117117
}
118118
else if (((XBYTE)lpszMsgBuffer[0] >> 6) == 2)
@@ -352,7 +352,7 @@ bool PullStream_ClientWhep_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
352352

353353
ModuleSession_PullStream_Insert(tszUserStr, tszSMSAddr, tszPushAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
354354
ModuleSession_PullStream_RTCSet(tszUserStr, tszTokenStr, tszICEUser, tszICEPass, tszHMacStr);
355-
SocketOpt_HeartBeat_InsertAddrEx(xhRTCHeart, tszUserStr); //需要加入心跳,不然没法知道超时
355+
SocketOpt_HeartBeat_InsertAddrEx(xhRTCWhepHeart, tszUserStr); //需要加入心跳,不然没法知道超时
356356

357357
if (nIndex1 >= 0 && nIndex2 >= 0)
358358
{

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_ClientWebRtc.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ bool PushStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
4444
}
4545
else
4646
{
47-
bool bRet = Cryption_Server_AcceptMemoryEx(xhRTCSsl, hSocket, lpszClientAddr, tszSDBuffer, &nSDLen, lpszMsgBuffer, nMsgLen);
47+
bool bRet = Cryption_Server_AcceptMemoryEx(xhRTCWhipSsl, hSocket, lpszClientAddr, tszSDBuffer, &nSDLen, lpszMsgBuffer, nMsgLen);
4848
if (nSDLen > 0)
4949
{
5050
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTC);
@@ -53,7 +53,7 @@ bool PushStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
5353
if (bRet)
5454
{
5555
XBYTE tszKEYBuffer[XPATH_MAX] = {};
56-
Cryption_Server_GetKeyEx(xhRTCSsl, lpszClientAddr, tszKEYBuffer);
56+
Cryption_Server_GetKeyEx(xhRTCWhipSsl, lpszClientAddr, tszKEYBuffer);
5757
ModuleHelp_SRTPCore_Create(tszKEYBuffer);
5858

5959
XCHAR tszSMSName[128] = {};
@@ -111,7 +111,7 @@ bool PushStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
111111
NatProtocol_StunNat_Packet(tszSDBuffer, &nSDLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_RESPONSE, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS, tszRVBuffer, true, st_ServiceConfig.st_XPull.st_PullWebRtc.tszICEPass, true);
112112
//更新绑定的地址
113113
ModuleSession_PullStream_RTCAddrSet(tszUserStr, lpszClientAddr);
114-
SocketOpt_HeartBeat_ActiveAddrEx(xhRTCHeart, tszUserStr); //激活一次心跳
114+
SocketOpt_HeartBeat_ActiveAddrEx(xhRTCWhipHeart, tszUserStr); //激活一次心跳
115115
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTC);
116116
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,请求的STUN协议处理成功,请求的用户:%s"), lpszClientAddr, tszUserStr);
117117
}
@@ -214,6 +214,7 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
214214
XNETHANDLE xhPacket = 0;
215215
XCHAR tszRVBuffer[4096] = {};
216216
XCHAR tszSDBuffer[4096] = {};
217+
XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
217218
RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {};
218219

219220
st_HDRParam.nHttpCode = 200; //HTTP CODE码
@@ -225,7 +226,6 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
225226
BaseLib_String_GetStartEnd(pSt_HTTPParam->tszHttpUri, tszSMSAddr + _tcsxlen(tszSMSAddr), _X("stream="), NULL);
226227
//查找流是否存在
227228
XCHAR tszPushAddr[128] = {};
228-
XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
229229
if (ModuleSession_PushStream_FindStream(tszSMSAddr, tszPushAddr))
230230
{
231231
ModuleProtocol_Packet_Comm(tszRVBuffer, &nRVLen, NULL, 400, "stream is published");
@@ -282,6 +282,10 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
282282
{
283283
nAudioIndex = _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]);
284284
st_SDPAudioInfo = st_SDPMeida;
285+
286+
st_AVInfo.st_AudioInfo.bEnable = true;
287+
st_AVInfo.st_AudioInfo.nChannel = st_SDPMeida.st_RTPMap.nChannel;
288+
st_AVInfo.st_AudioInfo.nSampleRate = st_SDPMeida.st_RTPMap.nSampleRate;
285289
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,找到了合适的音频信息索引:%s"), lpszClientAddr, ppSt_AVMedia[i]->pptszAVList[j]);
286290
break;
287291
}
@@ -299,6 +303,10 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
299303
{
300304
nVideoIndex = _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]);
301305
st_SDPVideoInfo = st_SDPMeida;
306+
307+
st_AVInfo.st_VideoInfo.bEnable = true;
308+
st_AVInfo.st_VideoInfo.nFrameNumber = st_SDPMeida.st_FmtpVideo.nFrameRate;
309+
st_AVInfo.st_VideoInfo.nBitRate = st_SDPMeida.st_RTPMap.nSampleRate;
302310
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,找到了合适的视频信息索引:%s,帧率:%d"), lpszClientAddr, ppSt_AVMedia[i]->pptszAVList[j], st_AVInfo.st_VideoInfo.nFrameRate);
303311
}
304312
}
@@ -332,10 +340,6 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
332340
_xstprintf(tszUserStr, _X("%s:%s"), st_ServiceConfig.st_XPull.st_PullWebRtc.tszICEUser, tszICEUser);
333341
_xstprintf(tszHDRStr, _X("Location: /rtc/v1/whip/?action=delete&token=%s&app=live&stream=livestream.flv&session=%s\r\n"), tszTokenStr, tszUserStr);
334342

335-
ModuleSession_PullStream_Insert(tszUserStr, tszSMSAddr, tszPushAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
336-
ModuleSession_PullStream_RTCSet(tszUserStr, tszTokenStr, tszICEUser, tszICEPass, tszHMacStr);
337-
SocketOpt_HeartBeat_InsertAddrEx(xhRTCHeart, tszUserStr); //需要加入心跳,不然没法知道超时
338-
339343
if (nIndex1 >= 0 && nIndex2 >= 0)
340344
{
341345
PushStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, false, nAudioIndex, &st_SDPAudioInfo);
@@ -349,7 +353,13 @@ bool PushStream_ClientWhip_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LP
349353
SDPProtocol_Packet_GetPacket(xhPacket, tszRVBuffer, &nRVLen);
350354
SDPProtocol_Packet_Destory(xhPacket);
351355

356+
ModuleSession_PushStream_Create(tszUserStr, tszSMSAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
357+
ModuleSession_PushStream_SetAVInfo(tszUserStr, &st_AVInfo);
358+
ModuleSession_PullStream_RTCSet(tszUserStr, tszTokenStr, tszICEUser, tszICEPass, tszHMacStr);
359+
SocketOpt_HeartBeat_InsertAddrEx(xhRTCWhipHeart, tszUserStr); //需要加入心跳,不然没法知道超时
360+
352361
st_HDRParam.nHttpCode = 201;
362+
_xstprintf(st_HDRParam.tszMimeType, _X("sdp"));
353363
HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen, tszHDRStr);
354364
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
355365
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,Whip协议推流请求成功"), lpszClientAddr);

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_Hdr.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,12 @@ extern XHANDLE xhVRTCPSocket;
136136
extern XHANDLE xhARTPSocket;
137137
extern XHANDLE xhARTCPSocket;
138138
//WEBRTC网络
139-
extern XHANDLE xhRTCSocket;
140-
extern XHANDLE xhRTCHeart;
141-
extern XHANDLE xhRTCSsl;
139+
extern XHANDLE xhRTCWhepSocket;
140+
extern XHANDLE xhRTCWhepHeart;
141+
extern XHANDLE xhRTCWhepSsl;
142+
extern XHANDLE xhRTCWhipSocket;
143+
extern XHANDLE xhRTCWhipHeart;
144+
extern XHANDLE xhRTCWhipSsl;
142145
//HLS流
143146
extern XNETHANDLE xhHLSFile;
144147
//配置文件

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_Network.cpp

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,22 @@ void XCALLBACK Network_Callback_AudioRTCPRecv(LPCXSTR lpszClientAddr, XSOCKET hS
159159
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("RTCP音频客户端:%s,发送数据大小:%d 给服务器"), lpszClientAddr, nMsgLen);
160160
}
161161
//WEBRTC
162-
void XCALLBACK Network_Callback_RTCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam)
162+
void XCALLBACK Network_Callback_RTCWhepRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam)
163163
{
164164
PullStream_ClientProtocol_Handle(lpszClientAddr, hSocket, lpszRecvMsg, nMsgLen);
165165
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("STUN客户端:%s,发送数据大小:%d 给服务器"), lpszClientAddr, nMsgLen);
166166
}
167-
void XCALLBACK Network_Callback_RTCHBLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam)
167+
void XCALLBACK Network_Callback_RTCWhipRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam)
168+
{
169+
PushStream_ClientProtocol_Handle(lpszClientAddr, hSocket, lpszRecvMsg, nMsgLen);
170+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("STUN客户端:%s,发送数据大小:%d 给服务器"), lpszClientAddr, nMsgLen);
171+
}
172+
void XCALLBACK Network_Callback_RTCWhepLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam)
173+
{
174+
XEngine_Network_Close(lpszClientAddr, hSocket, true, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
175+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,离开了服务器"), lpszClientAddr);
176+
}
177+
void XCALLBACK Network_Callback_RTCWhipLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam)
168178
{
169179
XEngine_Network_Close(lpszClientAddr, hSocket, true, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
170180
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,离开了服务器"), lpszClientAddr);
@@ -334,7 +344,19 @@ bool XEngine_Network_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMs
334344
XCHAR tszIPPort[128] = {};
335345
_tcsxcpy(tszIPPort, lpszClientAddr);
336346
APIAddr_IPAddr_SegAddr(tszIPPort, &nPort);
337-
if (!NetCore_UDPSelect_Send(xhRTCSocket, lpszMsgBuffer, nMsgLen, tszIPPort, nPort))
347+
if (!NetCore_UDPSelect_Send(xhRTCWhipSocket, lpszMsgBuffer, nMsgLen, tszIPPort, nPort))
348+
{
349+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("RTC服务端:%s,发送数据失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, NetCore_GetLastError());
350+
return false;
351+
}
352+
}
353+
else if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC == enClientType)
354+
{
355+
int nPort = 0;
356+
XCHAR tszIPPort[128] = {};
357+
_tcsxcpy(tszIPPort, lpszClientAddr);
358+
APIAddr_IPAddr_SegAddr(tszIPPort, &nPort);
359+
if (!NetCore_UDPSelect_Send(xhRTCWhepSocket, lpszMsgBuffer, nMsgLen, tszIPPort, nPort))
338360
{
339361
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("RTC服务端:%s,发送数据失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, NetCore_GetLastError());
340362
return false;

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_Network.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ void XCALLBACK Network_Callback_VideoRTCPRecv(LPCXSTR lpszClientAddr, XSOCKET hS
4040
void XCALLBACK Network_Callback_AudioRTPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam);
4141
void XCALLBACK Network_Callback_AudioRTCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam);
4242
//WEBRTC
43-
void XCALLBACK Network_Callback_RTCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam);
44-
void XCALLBACK Network_Callback_RTCHBLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam);
43+
void XCALLBACK Network_Callback_RTCWhepRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam);
44+
void XCALLBACK Network_Callback_RTCWhipRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam);
45+
void XCALLBACK Network_Callback_RTCWhepLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam);
46+
void XCALLBACK Network_Callback_RTCWhipLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam);
4547
//关闭与发送
4648
void XEngine_Network_Close(LPCXSTR lpszClientAddr, XSOCKET hSocket, bool bHeart, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enClientType);
4749
bool XEngine_Network_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enClientType);

0 commit comments

Comments
 (0)