Skip to content

Commit 33195ab

Browse files
committed
added:ssrc set for session module
modify:sdp packet work now modify:sometime aac packet size is to big and tips
1 parent db56b89 commit 33195ab

File tree

7 files changed

+156
-22
lines changed

7 files changed

+156
-22
lines changed

XEngine_Source/XEngine_ModuleSession/ModuleSession_Define.h

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ typedef struct
3030
XCHAR tszICEUser[MAX_PATH];
3131
XCHAR tszICEPass[MAX_PATH];
3232
XCHAR tszHMacStr[MAX_PATH];
33+
34+
XNETHANDLE nVSsrc;
35+
XCHAR tszVideoCName[MAX_PATH];
36+
XCHAR tszVideoLabel[MAX_PATH];
37+
38+
XNETHANDLE nASsrc;
39+
XCHAR tszAudioCName[MAX_PATH];
40+
XCHAR tszAudioLabel[MAX_PATH];
3341
}st_WEBRtc;
3442
XCHAR tszSMSAddr[MAX_PATH];
3543
XCHAR tszPushAddr[MAX_PATH];
@@ -258,22 +266,22 @@ extern "C" bool ModuleSession_PullStream_RTCSet(LPCXSTR lpszClientAddr, LPCXSTR
258266
可空:N
259267
意思:输入要处理的客户端
260268
参数.二:ptszTokenStr
261-
In/Out:In
269+
In/Out:Out
262270
类型:字符指针
263271
可空:N
264272
意思:输出TOKEN
265273
参数.三:ptszICEUser
266-
In/Out:In
274+
In/Out:Out
267275
类型:字符指针
268276
可空:N
269277
意思:输出ICE用户
270278
参数.四:ptszICEPass
271-
In/Out:In
279+
In/Out:Out
272280
类型:字符指针
273281
可空:N
274282
意思:输出ICE密码
275283
参数.五:ptszHMacStr
276-
In/Out:In
284+
In/Out:Out
277285
类型:字符指针
278286
可空:N
279287
意思:输出HMAC的SHA值
@@ -283,6 +291,40 @@ extern "C" bool ModuleSession_PullStream_RTCSet(LPCXSTR lpszClientAddr, LPCXSTR
283291
备注:
284292
*********************************************************************/
285293
extern "C" bool ModuleSession_PullStream_RTCGet(LPCXSTR lpszClientAddr, XCHAR * ptszTokenStr = NULL, XCHAR * ptszICEUser = NULL, XCHAR * ptszICEPass = NULL, XCHAR * ptszHMacStr = NULL);
294+
/********************************************************************
295+
函数名称:ModuleSession_PullStream_RTCSSrcSet
296+
函数功能:设置SSRC
297+
参数.一:lpszClientAddr
298+
In/Out:In
299+
类型:常量字符指针
300+
可空:N
301+
意思:输入要处理的客户端
302+
参数.二:nSSrc
303+
In/Out:In
304+
类型:整数型
305+
可空:N
306+
意思:输入要设置的SSRC
307+
参数.三:lpszCNameStr
308+
In/Out:In
309+
类型:常量字符指针
310+
可空:N
311+
意思:输入SSRC别名
312+
参数.四:lpszLabelStr
313+
In/Out:In
314+
类型:常量字符指针
315+
可空:N
316+
意思:输入SSRC描述
317+
参数.五:bVideo
318+
In/Out:In
319+
类型:逻辑型
320+
可空:N
321+
意思:输入是否为视频
322+
返回值
323+
类型:逻辑型
324+
意思:是否成功
325+
备注:
326+
*********************************************************************/
327+
extern "C" bool ModuleSession_PullStream_RTCSSrcSet(LPCXSTR lpszClientAddr, XNETHANDLE nSSrc, LPCXSTR lpszCNameStr, LPCXSTR lpszLabelStr, bool bVideo = true);
286328
/*********************************************************************************
287329
* 推流端导出会话模块 *
288330
*********************************************************************************/

XEngine_Source/XEngine_ModuleSession/ModuleSession_PullStream/ModuleSession_PullStream.cpp

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,22 +447,22 @@ bool CModuleSession_PullStream::ModuleSession_PullStream_RTCSet(LPCXSTR lpszClie
447447
可空:N
448448
意思:输入要处理的客户端
449449
参数.二:ptszTokenStr
450-
In/Out:In
450+
In/Out:Out
451451
类型:字符指针
452452
可空:N
453453
意思:输出TOKEN
454454
参数.三:ptszICEUser
455-
In/Out:In
455+
In/Out:Out
456456
类型:字符指针
457457
可空:N
458458
意思:输出ICE用户
459459
参数.四:ptszICEPass
460-
In/Out:In
460+
In/Out:Out
461461
类型:字符指针
462462
可空:N
463463
意思:输出ICE密码
464464
参数.五:ptszHMacStr
465-
In/Out:In
465+
In/Out:Out
466466
类型:字符指针
467467
可空:N
468468
意思:输出HMAC的SHA值
@@ -503,4 +503,66 @@ bool CModuleSession_PullStream::ModuleSession_PullStream_RTCGet(LPCXSTR lpszClie
503503
}
504504
st_Locker.unlock_shared();
505505
return true;
506+
}
507+
/********************************************************************
508+
函数名称:ModuleSession_PullStream_RTCSSrcSet
509+
函数功能:设置SSRC
510+
参数.一:lpszClientAddr
511+
In/Out:In
512+
类型:常量字符指针
513+
可空:N
514+
意思:输入要处理的客户端
515+
参数.二:nSSrc
516+
In/Out:In
517+
类型:整数型
518+
可空:N
519+
意思:输入要设置的SSRC
520+
参数.三:lpszCNameStr
521+
In/Out:In
522+
类型:常量字符指针
523+
可空:N
524+
意思:输入SSRC别名
525+
参数.四:lpszLabelStr
526+
In/Out:In
527+
类型:常量字符指针
528+
可空:N
529+
意思:输入SSRC描述
530+
参数.五:bVideo
531+
In/Out:In
532+
类型:逻辑型
533+
可空:N
534+
意思:输入是否为视频
535+
返回值
536+
类型:逻辑型
537+
意思:是否成功
538+
备注:
539+
*********************************************************************/
540+
bool CModuleSession_PullStream::ModuleSession_PullStream_RTCSSrcSet(LPCXSTR lpszClientAddr, XNETHANDLE nSSrc, LPCXSTR lpszCNameStr, LPCXSTR lpszLabelStr, bool bVideo)
541+
{
542+
Session_IsErrorOccur = false;
543+
544+
st_Locker.lock_shared();
545+
auto stl_MapIterator = stl_MapClient.find(lpszClientAddr);
546+
if (stl_MapIterator == stl_MapClient.end())
547+
{
548+
Session_IsErrorOccur = true;
549+
Session_dwErrorCode = ERROR_STREAMMEDIA_MODULE_SESSION_NOTFOUND;
550+
st_Locker.unlock_shared();
551+
return false;
552+
}
553+
554+
if (bVideo)
555+
{
556+
stl_MapIterator->second->st_WEBRtc.nVSsrc = nSSrc;
557+
_tcsxcpy(stl_MapIterator->second->st_WEBRtc.tszVideoCName, lpszCNameStr);
558+
_tcsxcpy(stl_MapIterator->second->st_WEBRtc.tszVideoLabel, lpszLabelStr);
559+
}
560+
else
561+
{
562+
stl_MapIterator->second->st_WEBRtc.nASsrc = nSSrc;
563+
_tcsxcpy(stl_MapIterator->second->st_WEBRtc.tszAudioCName, lpszCNameStr);
564+
_tcsxcpy(stl_MapIterator->second->st_WEBRtc.tszAudioLabel, lpszLabelStr);
565+
}
566+
st_Locker.unlock_shared();
567+
return true;
506568
}

XEngine_Source/XEngine_ModuleSession/ModuleSession_PullStream/ModuleSession_PullStream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class CModuleSession_PullStream
2929
public:
3030
bool ModuleSession_PullStream_RTCSet(LPCXSTR lpszClientAddr, LPCXSTR lpszTokenStr, LPCXSTR lpszICEUser, LPCXSTR lpszICEPass, LPCXSTR lpszHMacStr);
3131
bool ModuleSession_PullStream_RTCGet(LPCXSTR lpszClientAddr, XCHAR* ptszTokenStr = NULL, XCHAR* ptszICEUser = NULL, XCHAR* ptszICEPass = NULL, XCHAR* ptszHMacStr = NULL);
32+
bool ModuleSession_PullStream_RTCSSrcSet(LPCXSTR lpszClientAddr, XNETHANDLE nSSrc, LPCXSTR lpszCNameStr, LPCXSTR lpszLabelStr, bool bVideo = true);
33+
//bool ModuleSession_PullStream_RTCSSrcGet(LPCXSTR lpszClientAddr, XCHAR* ptszTokenStr = NULL, XCHAR* ptszICEUser = NULL, XCHAR* ptszICEPass = NULL, XCHAR* ptszHMacStr = NULL);
3234
private:
3335
shared_mutex st_Locker;
3436
private:

XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ EXPORTS
1616
ModuleSession_PullStream_FLVTagGet
1717
ModuleSession_PullStream_RTCSet
1818
ModuleSession_PullStream_RTCGet
19+
ModuleSession_PullStream_RTCSSrcSet
1920

2021
ModuleSession_PushStream_Create
2122
ModuleSession_PushStream_Destroy

XEngine_Source/XEngine_ModuleSession/pch.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ extern "C" bool ModuleSession_PullStream_RTCGet(LPCXSTR lpszClientAddr, XCHAR *
5555
{
5656
return m_PullStream.ModuleSession_PullStream_RTCGet(lpszClientAddr, ptszTokenStr, ptszICEUser, ptszICEPass, ptszHMacStr);
5757
}
58+
extern "C" bool ModuleSession_PullStream_RTCSSrcSet(LPCXSTR lpszClientAddr, XNETHANDLE nSSrc, LPCXSTR lpszCNameStr, LPCXSTR lpszLabelStr, bool bVideo)
59+
{
60+
return m_PullStream.ModuleSession_PullStream_RTCSSrcSet(lpszClientAddr, nSSrc, lpszCNameStr, lpszLabelStr, bVideo);
61+
}
5862
extern "C" bool ModuleSession_PullStream_Delete(LPCXSTR lpszClientAddr)
5963
{
6064
return m_PullStream.ModuleSession_PullStream_Delete(lpszClientAddr);

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientWebRtc.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
7979
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListAttr, nAttrCount);
8080

8181
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTC);
82-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("STUN客户端:%s,请求的STUN协议处理成功,请求的用户:%s"), lpszClientAddr, tszUserStr);
82+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("STUN客户端:%s,请求的STUN协议处理成功,请求的用户:%s,密码:%s"), lpszClientAddr, tszUserStr, tszICEPass);
8383
}
8484
else
8585
{
@@ -88,7 +88,7 @@ bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
8888

8989
return true;
9090
}
91-
bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, bool bVideo, XENGINE_PROTOCOL_AVINFO* pSt_AVInfo)
91+
bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, LPCXSTR lpszClientID, bool bVideo, XENGINE_PROTOCOL_AVINFO* pSt_AVInfo)
9292
{
9393
XCHAR** pptszAVList;
9494
BaseLib_OperatorMemory_Malloc((XPPPMEM)&pptszAVList, 1, MAX_PATH);
@@ -97,11 +97,13 @@ bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, bool bVideo, XENGINE
9797
{
9898
_tcsxcpy(pptszAVList[0], _X("106"));
9999
SDPProtocol_Packet_AddMedia(xhPacket, _X("video"), _X("UDP/TLS/RTP/SAVPF"), &pptszAVList, 1, 9);
100+
SDPProtocol_Packet_ClientInet(xhPacket);
100101
}
101102
else
102103
{
103104
_tcsxcpy(pptszAVList[0], _X("111"));
104105
SDPProtocol_Packet_AddMedia(xhPacket, _X("audio"), _X("UDP/TLS/RTP/SAVPF"), &pptszAVList, 1, 9);
106+
SDPProtocol_Packet_ClientInet(xhPacket);
105107
}
106108
//生成用户和密码
107109
SDPProtocol_Packet_ICEUser(xhPacket, st_ServiceConfig.st_XPull.st_PullWebRtc.tszICEUser, st_ServiceConfig.st_XPull.st_PullWebRtc.tszICEPass);
@@ -121,13 +123,13 @@ bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, bool bVideo, XENGINE
121123
tszDigestHex[nPos - 1] = '\0';
122124
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("fingerprint"), tszDigestHex);
123125
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("setup"), _X("passive"));
124-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("extmap"), _X("3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"));
125-
SDPProtocol_Packet_OnlyRWFlag(xhPacket, true);
126-
SDPProtocol_Packet_RtcpComm(xhPacket, true, true);
127-
128126
if (bVideo)
129127
{
130128
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("mid"), _X("1"));
129+
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("extmap"), _X("3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"));
130+
SDPProtocol_Packet_OnlyRWFlag(xhPacket, true);
131+
SDPProtocol_Packet_RtcpComm(xhPacket, true, true);
132+
131133
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtpmap"), _X("106 H264/90000"));
132134
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("106 transport-cc"));
133135
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("106 nack"));
@@ -144,14 +146,26 @@ bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, bool bVideo, XENGINE
144146
st_SDPMedia.st_FmtpVideo.tszLeaveId[1] = tszSPSBuffer[1];
145147
st_SDPMedia.st_FmtpVideo.tszLeaveId[2] = tszSPSBuffer[2];
146148
SDPProtocol_Packet_VideoFmt(xhPacket, 106, &st_SDPMedia, true);
147-
SDPProtocol_Packet_CName(xhPacket, 2124085006, _X("79a9722580589zr5"), _X("video-666q08to"));
149+
150+
XNETHANDLE nVSSrc = 0;
151+
BaseLib_OperatorHandle_Create(&nVSSrc, 2000000000, 3000000000);
152+
SDPProtocol_Packet_CName(xhPacket, nVSSrc, _X("79a9722580589zr5"), _X("video-666q08to"));
153+
ModuleSession_PullStream_RTCSSrcSet(lpszClientID, nVSSrc, _X("79a9722580589zr5"), _X("video-666q08to"));
148154
}
149155
else
150156
{
151157
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("mid"), _X("0"));
158+
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("extmap"), _X("3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"));
159+
SDPProtocol_Packet_OnlyRWFlag(xhPacket, true);
160+
SDPProtocol_Packet_RtcpComm(xhPacket, true, true);
161+
152162
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtpmap"), _X("111 opus/48000/2"));
153163
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("111 transport-cc"));
154-
SDPProtocol_Packet_CName(xhPacket, 2124085006, _X("79a9722580589zr5"), _X("audio-23z8fj2g"));
164+
165+
XNETHANDLE nASSrc = 0;
166+
BaseLib_OperatorHandle_Create(&nASSrc, 2000000000, 3000000000);
167+
SDPProtocol_Packet_CName(xhPacket, nASSrc, _X("79a9722580589zr5"), _X("audio-23z8fj2g"));
168+
ModuleSession_PullStream_RTCSSrcSet(lpszClientID, nASSrc, _X("79a9722580589zr5"), _X("audio-23z8fj2g"), false);
155169
}
156170
SDPProtocol_Packet_OptionalCandidate(xhPacket, st_ServiceConfig.tszIPAddr, st_ServiceConfig.nRTCPort);
157171
BaseLib_OperatorMemory_Free((XPPPMEM)&pptszAVList, 1);
@@ -223,11 +237,6 @@ bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam,
223237
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("ice-lite"));
224238
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("msid-semantic"), _X("WMS live/livestream"));
225239

226-
PullStream_ClientWebRtc_SDKPacket(xhPacket, false, &st_AVInfo);
227-
PullStream_ClientWebRtc_SDKPacket(xhPacket, true, &st_AVInfo);
228-
SDPProtocol_Packet_GetPacket(xhPacket, tszRVBuffer, &nRVLen);
229-
SDPProtocol_Packet_Destory(xhPacket);
230-
231240
XCHAR tszTokenStr[MAX_PATH] = {};
232241
XCHAR tszHDRStr[MAX_PATH] = {};
233242
XCHAR tszUserStr[MAX_PATH] = {};
@@ -239,6 +248,11 @@ bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam,
239248
ModuleSession_PullStream_Insert(tszUserStr, tszSMSAddr, tszPushAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTC);
240249
ModuleSession_PullStream_RTCSet(tszUserStr, tszTokenStr, tszICEUser, tszICEPass, tszHMacStr);
241250

251+
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, false, &st_AVInfo);
252+
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, true, &st_AVInfo);
253+
SDPProtocol_Packet_GetPacket(xhPacket, tszRVBuffer, &nRVLen);
254+
SDPProtocol_Packet_Destory(xhPacket);
255+
242256
st_HDRParam.nHttpCode = 201;
243257
HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen, tszHDRStr);
244258
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_AVPacket.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,15 @@ bool XEngine_AVPacket_AVHdr(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n
289289
}
290290
bool XEngine_AVPacket_AVFrame(XCHAR* ptszSDBuffer, int* pInt_SDLen, XCHAR* ptszRVBuffer, int* pInt_RVLen, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, XBYTE byAVType)
291291
{
292+
if (1 == byAVType && nMsgLen > 1024)
293+
{
294+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("检测到推流:%s 过大的音频包:%d"), lpszClientAddr, nMsgLen);
295+
for (int i = 0; i < nMsgLen; i++)
296+
{
297+
printf("%02X ", (XBYTE)lpszMsgBuffer[i]);
298+
}
299+
printf("\n");
300+
}
292301
XBYTE byFrameType = 0;
293302
if (0 == byAVType)
294303
{
@@ -399,7 +408,7 @@ bool XEngine_AVPacket_AVFrame(XCHAR* ptszSDBuffer, int* pInt_SDLen, XCHAR* ptszR
399408
}
400409
else
401410
{
402-
XCHAR byAACBuffer[1024] = {};
411+
XCHAR byAACBuffer[2048] = {};
403412
XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
404413

405414
ModuleSession_PushStream_GetAVInfo(lpszClientAddr, &st_AVInfo);

0 commit comments

Comments
 (0)