Skip to content

Commit 72ed2ed

Browse files
committed
fixed:the problem that the live of rtmp pull stream cannot be modified
1 parent 826b9db commit 72ed2ed

File tree

11 files changed

+268
-5
lines changed

11 files changed

+268
-5
lines changed

XEngine_Source/XEngine_ModuleHelp/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ LOADHDR = -I ./
1010
LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_Core
1111
LIB = -lXEngine_OPenSsl
1212
LIBEX = -lsrt-gnutls
13-
OBJECTS = ModuleHelp_JT1078.o ModuleHelp_SrtCore.o ModuleHelp_Rtsp.o pch.o
13+
OBJECTS = ModuleHelp_JT1078.o ModuleHelp_SrtCore.o ModuleHelp_Rtsp.o ModuleHelp_Rtmp.o pch.o
1414

1515
ifeq ($(RELEASE),1)
1616
FLAGS = -c
@@ -58,6 +58,8 @@ ModuleHelp_SrtCore.o:./ModuleHelp_Srt/ModuleHelp_SrtCore.cpp
5858
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleHelp_Srt/ModuleHelp_SrtCore.cpp
5959
ModuleHelp_Rtsp.o:./ModuleHelp_Rtsp/ModuleHelp_Rtsp.cpp
6060
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleHelp_Rtsp/ModuleHelp_Rtsp.cpp
61+
ModuleHelp_Rtmp.o:./ModuleHelp_Rtmp/ModuleHelp_Rtmp.cpp
62+
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleHelp_Rtmp/ModuleHelp_Rtmp.cpp
6163

6264
pch.o:./pch.cpp
6365
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp

XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,4 +379,59 @@ extern "C" bool ModuleHelp_Rtsp_GetSsrc(LPCXSTR lpszClientID, XCHAR* ptszSsrcStr
379379
意思:是否成功
380380
备注:
381381
*********************************************************************/
382-
extern "C" bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, bool* pbVideo);
382+
extern "C" bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, bool* pbVideo);
383+
/************************************************************************/
384+
/* 导出的RTMP函数 */
385+
/************************************************************************/
386+
/********************************************************************
387+
函数名称:ModuleHelp_Rtmp_CreateSession
388+
函数功能:创建一个rtmp会话
389+
参数.一:lpszURLAddr
390+
In/Out:In
391+
类型:常量字符指针
392+
可空:N
393+
意思:输入创建的地址
394+
参数.二:lpszURLStr
395+
In/Out:Out
396+
类型:常量字符指针
397+
可空:N
398+
意思:输入要解析的URL
399+
返回值
400+
类型:逻辑型
401+
意思:是否成功
402+
备注:
403+
*********************************************************************/
404+
extern "C" bool ModuleHelp_Rtmp_CreateSession(LPCXSTR lpszURLAddr, LPCXSTR lpszURLStr);
405+
/********************************************************************
406+
函数名称:ModuleHelp_Rtmp_GetSession
407+
函数功能:获取会话名称
408+
参数.一:lpszURLAddr
409+
In/Out:In
410+
类型:常量字符指针
411+
可空:N
412+
意思:输入要处理的客户端ID
413+
参数.二:ptszLiveName
414+
In/Out:In
415+
类型:字符指针
416+
可空:N
417+
意思:输出RTMP的LIVE名称
418+
返回值
419+
类型:逻辑型
420+
意思:是否成功
421+
备注:
422+
*********************************************************************/
423+
extern "C" bool ModuleHelp_Rtmp_GetSession(LPCXSTR lpszURLAddr, XCHAR* ptszLiveName);
424+
/********************************************************************
425+
函数名称:ModuleHelp_Rtmp_DeleteSession
426+
函数功能:删除一个RTMP客户端
427+
参数.一:lpszURLAddr
428+
In/Out:In
429+
类型:常量字符指针
430+
可空:N
431+
意思:输入要处理的客户端ID
432+
返回值
433+
类型:逻辑型
434+
意思:是否成功
435+
备注:
436+
*********************************************************************/
437+
extern "C" bool ModuleHelp_Rtmp_DeleteSession(LPCXSTR lpszURLAddr);

XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@
3030
//////////////////////////////////////////////////////////////////////////
3131
// 导出的RTSP错误
3232
//////////////////////////////////////////////////////////////////////////
33-
#define ERROR_MODULE_HELP_RTSP_NOTFOUND 0xD2001 //参数错误
33+
#define ERROR_MODULE_HELP_RTSP_NOTFOUND 0xD2001 //参数错误
34+
//////////////////////////////////////////////////////////////////////////
35+
// 导出的RTMP错误
36+
//////////////////////////////////////////////////////////////////////////
37+
#define ERROR_MODULE_HELP_RTMP_NOTFOUND 0xD3001
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#include "pch.h"
2+
#include "ModuleHelp_Rtmp.h"
3+
/********************************************************************
4+
// Created: 2023/12/14 14:29:19
5+
// File Name: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Rtmp\ModuleHelp_Rtmp.cpp
6+
// File Path: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Rtmp
7+
// File Base: ModuleHelp_Rtmp
8+
// File Ext: cpp
9+
// Project: XEngine(网络通信引擎)
10+
// Author: qyt
11+
// Purpose: RTMP协议处理帮助函数
12+
// History:
13+
*********************************************************************/
14+
CModuleHelp_Rtmp::CModuleHelp_Rtmp()
15+
{
16+
}
17+
CModuleHelp_Rtmp::~CModuleHelp_Rtmp()
18+
{
19+
}
20+
//////////////////////////////////////////////////////////////////////////
21+
// 公有函数
22+
//////////////////////////////////////////////////////////////////////////
23+
/********************************************************************
24+
函数名称:ModuleHelp_Rtmp_CreateSession
25+
函数功能:创建一个rtmp会话
26+
参数.一:lpszURLAddr
27+
In/Out:In
28+
类型:常量字符指针
29+
可空:N
30+
意思:输入创建的地址
31+
参数.二:lpszURLStr
32+
In/Out:Out
33+
类型:常量字符指针
34+
可空:N
35+
意思:输入要解析的URL
36+
返回值
37+
类型:逻辑型
38+
意思:是否成功
39+
备注:
40+
*********************************************************************/
41+
bool CModuleHelp_Rtmp::ModuleHelp_Rtmp_CreateSession(LPCXSTR lpszURLAddr, LPCXSTR lpszURLStr)
42+
{
43+
ModuleHelp_IsErrorOccur = false;
44+
45+
RTMPPROTOCOL_CLIENTINFO st_RTMPInfo = {};
46+
_tcsxcpy(st_RTMPInfo.tszURLStr, lpszURLStr);
47+
48+
size_t nLen = _tcsxlen(lpszURLStr);
49+
for (size_t i = nLen; i != 0; i--)
50+
{
51+
if (lpszURLStr[i] == '/')
52+
{
53+
_tcsxcpy(st_RTMPInfo.tszLiveName, lpszURLStr + i + 1);
54+
break;
55+
}
56+
}
57+
st_Locker.lock();
58+
stl_MapRTMPClient.insert(make_pair(lpszURLAddr, st_RTMPInfo));
59+
st_Locker.unlock();
60+
return true;
61+
}
62+
/********************************************************************
63+
函数名称:ModuleHelp_Rtmp_GetSession
64+
函数功能:获取会话名称
65+
参数.一:lpszURLAddr
66+
In/Out:In
67+
类型:常量字符指针
68+
可空:N
69+
意思:输入要处理的客户端ID
70+
参数.二:ptszLiveName
71+
In/Out:In
72+
类型:字符指针
73+
可空:N
74+
意思:输出RTMP的LIVE名称
75+
返回值
76+
类型:逻辑型
77+
意思:是否成功
78+
备注:
79+
*********************************************************************/
80+
bool CModuleHelp_Rtmp::ModuleHelp_Rtmp_GetSession(LPCXSTR lpszURLAddr, XCHAR* ptszLiveName)
81+
{
82+
ModuleHelp_IsErrorOccur = false;
83+
84+
st_Locker.lock_shared();
85+
auto stl_MapIterator = stl_MapRTMPClient.find(lpszURLAddr);
86+
if (stl_MapIterator == stl_MapRTMPClient.end())
87+
{
88+
ModuleHelp_IsErrorOccur = true;
89+
ModuleHelp_dwErrorCode = ERROR_MODULE_HELP_RTMP_NOTFOUND;
90+
st_Locker.unlock_shared();
91+
return false;
92+
}
93+
_tcsxcpy(ptszLiveName, stl_MapIterator->second.tszLiveName);
94+
st_Locker.unlock_shared();
95+
return true;
96+
}
97+
/********************************************************************
98+
函数名称:ModuleHelp_Rtmp_DeleteSession
99+
函数功能:删除一个RTMP客户端
100+
参数.一:lpszURLAddr
101+
In/Out:In
102+
类型:常量字符指针
103+
可空:N
104+
意思:输入要处理的客户端ID
105+
返回值
106+
类型:逻辑型
107+
意思:是否成功
108+
备注:
109+
*********************************************************************/
110+
bool CModuleHelp_Rtmp::ModuleHelp_Rtmp_DeleteSession(LPCXSTR lpszURLAddr)
111+
{
112+
ModuleHelp_IsErrorOccur = false;
113+
114+
st_Locker.lock();
115+
auto stl_MapIterator = stl_MapRTMPClient.find(lpszURLAddr);
116+
if (stl_MapIterator != stl_MapRTMPClient.end())
117+
{
118+
stl_MapRTMPClient.erase(stl_MapIterator);
119+
}
120+
st_Locker.unlock();
121+
return true;
122+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
/********************************************************************
3+
// Created: 2023/12/14 14:26:40
4+
// File Name: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Rtmp\ModuleHelp_Rtmp.h
5+
// File Path: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Rtmp
6+
// File Base: ModuleHelp_Rtmp
7+
// File Ext: h
8+
// Project: XEngine(网络通信引擎)
9+
// Author: qyt
10+
// Purpose: RTMP协议处理帮助函数
11+
// History:
12+
*********************************************************************/
13+
14+
typedef struct
15+
{
16+
XCHAR tszLiveName[MAX_PATH];
17+
XCHAR tszURLStr[MAX_PATH];
18+
}RTMPPROTOCOL_CLIENTINFO;
19+
20+
class CModuleHelp_Rtmp
21+
{
22+
public:
23+
CModuleHelp_Rtmp();
24+
~CModuleHelp_Rtmp();
25+
public:
26+
bool ModuleHelp_Rtmp_CreateSession(LPCXSTR lpszURLAddr, LPCXSTR lpszURLStr);
27+
bool ModuleHelp_Rtmp_GetSession(LPCXSTR lpszURLAddr, XCHAR* ptszLiveName);
28+
bool ModuleHelp_Rtmp_DeleteSession(LPCXSTR lpszURLAddr);
29+
protected:
30+
shared_mutex st_Locker;
31+
private:
32+
unordered_map<string, RTMPPROTOCOL_CLIENTINFO> stl_MapRTMPClient;
33+
};

XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ EXPORTS
2222
ModuleHelp_Rtsp_GetSession
2323
ModuleHelp_Rtsp_SetSsrc
2424
ModuleHelp_Rtsp_GetSsrc
25-
ModuleHelp_Rtsp_GetTrack
25+
ModuleHelp_Rtsp_GetTrack
26+
27+
ModuleHelp_Rtmp_CreateSession
28+
ModuleHelp_Rtmp_GetSession
29+
ModuleHelp_Rtmp_DeleteSession

XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,15 @@
167167
<ClInclude Include="ModuleHelp_Define.h" />
168168
<ClInclude Include="ModuleHelp_Error.h" />
169169
<ClInclude Include="ModuleHelp_JT1078\ModuleHelp_JT1078.h" />
170+
<ClInclude Include="ModuleHelp_Rtmp\ModuleHelp_Rtmp.h" />
170171
<ClInclude Include="ModuleHelp_Rtsp\ModuleHelp_Rtsp.h" />
171172
<ClInclude Include="ModuleHelp_Srt\ModuleHelp_SrtCore.h" />
172173
<ClInclude Include="pch.h" />
173174
</ItemGroup>
174175
<ItemGroup>
175176
<ClCompile Include="dllmain.cpp" />
176177
<ClCompile Include="ModuleHelp_JT1078\ModuleHelp_JT1078.cpp" />
178+
<ClCompile Include="ModuleHelp_Rtmp\ModuleHelp_Rtmp.cpp" />
177179
<ClCompile Include="ModuleHelp_Rtsp\ModuleHelp_Rtsp.cpp" />
178180
<ClCompile Include="ModuleHelp_Srt\ModuleHelp_SrtCore.cpp" />
179181
<ClCompile Include="pch.cpp">

XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
<Filter Include="源文件\ModuleHelp_Rtsp">
3232
<UniqueIdentifier>{f6eb2770-0181-4b49-b121-21f704c2b26b}</UniqueIdentifier>
3333
</Filter>
34+
<Filter Include="头文件\ModuleHelp_Rtmp">
35+
<UniqueIdentifier>{a1903d48-4a4f-471b-b39d-9da25890d4cc}</UniqueIdentifier>
36+
</Filter>
37+
<Filter Include="源文件\ModuleHelp_Rtmp">
38+
<UniqueIdentifier>{301461bf-f0c1-48b4-85e9-5424834f57e7}</UniqueIdentifier>
39+
</Filter>
3440
</ItemGroup>
3541
<ItemGroup>
3642
<ClInclude Include="framework.h">
@@ -54,6 +60,9 @@
5460
<ClInclude Include="ModuleHelp_Rtsp\ModuleHelp_Rtsp.h">
5561
<Filter>头文件\ModuleHelp_Rtsp</Filter>
5662
</ClInclude>
63+
<ClInclude Include="ModuleHelp_Rtmp\ModuleHelp_Rtmp.h">
64+
<Filter>头文件\ModuleHelp_Rtmp</Filter>
65+
</ClInclude>
5766
</ItemGroup>
5867
<ItemGroup>
5968
<ClCompile Include="dllmain.cpp">
@@ -71,6 +80,9 @@
7180
<ClCompile Include="ModuleHelp_Rtsp\ModuleHelp_Rtsp.cpp">
7281
<Filter>源文件\ModuleHelp_Rtsp</Filter>
7382
</ClCompile>
83+
<ClCompile Include="ModuleHelp_Rtmp\ModuleHelp_Rtmp.cpp">
84+
<Filter>源文件\ModuleHelp_Rtmp</Filter>
85+
</ClCompile>
7486
</ItemGroup>
7587
<ItemGroup>
7688
<None Include="XEngine_ModuleHelp.def">

XEngine_Source/XEngine_ModuleHelp/pch.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "ModuleHelp_JT1078/ModuleHelp_JT1078.h"
33
#include "ModuleHelp_Srt/ModuleHelp_SrtCore.h"
44
#include "ModuleHelp_Rtsp/ModuleHelp_Rtsp.h"
5+
#include "ModuleHelp_Rtmp/ModuleHelp_Rtmp.h"
56
/********************************************************************
67
// Created: 2022/04/24 16:28:09
78
// File Name: D:\XEngine_StreamMedia\XEngine_Source\XEngine_ModuleHelp\pch.cpp
@@ -19,6 +20,7 @@ XLONG ModuleHelp_dwErrorCode = 0;
1920
CModuleHelp_JT1078 m_HelpJT1078;
2021
CModuleHelp_SrtCore m_SrtCore;
2122
CModuleHelp_Rtsp m_HelpRtsp;
23+
CModuleHelp_Rtmp m_HelpRtmp;
2224
//////////////////////////////////////////////////////////////////////////
2325
/// 导出的函数
2426
//////////////////////////////////////////////////////////////////////////
@@ -110,4 +112,19 @@ extern "C" bool ModuleHelp_Rtsp_GetSsrc(LPCXSTR lpszClientID, XCHAR * ptszSsrcSt
110112
extern "C" bool ModuleHelp_Rtsp_GetTrack(LPCXSTR lpszClientID, int nTrackID, bool* pbVideo)
111113
{
112114
return m_HelpRtsp.ModuleHelp_Rtsp_GetTrack(lpszClientID, nTrackID, pbVideo);
115+
}
116+
/************************************************************************/
117+
/* 导出的RTMP函数 */
118+
/************************************************************************/
119+
extern "C" bool ModuleHelp_Rtmp_CreateSession(LPCXSTR lpszURLAddr, LPCXSTR lpszURLStr)
120+
{
121+
return m_HelpRtmp.ModuleHelp_Rtmp_CreateSession(lpszURLAddr, lpszURLStr);
122+
}
123+
extern "C" bool ModuleHelp_Rtmp_GetSession(LPCXSTR lpszURLAddr, XCHAR * ptszLiveName)
124+
{
125+
return m_HelpRtmp.ModuleHelp_Rtmp_GetSession(lpszURLAddr, ptszLiveName);
126+
}
127+
extern "C" bool ModuleHelp_Rtmp_DeleteSession(LPCXSTR lpszURLAddr)
128+
{
129+
return m_HelpRtmp.ModuleHelp_Rtmp_DeleteSession(lpszURLAddr);
113130
}

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_RTMPTask.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,14 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
304304
}
305305
else if (0 == _tcsxnicmp(XENGINE_STREAMMEDIA_RTMP_COMMAND_CONNECT, st_RTMPCommand.tszCMDName, strlen(XENGINE_STREAMMEDIA_RTMP_COMMAND_CONNECT)))
306306
{
307+
for (int i = 0; i < st_RTMPCommand.nProCount; i++)
308+
{
309+
if (0 == _tcsxnicmp(st_RTMPCommand.ppSt_CMDProperty[i]->tszKeyBuffer, "tcurl", 5))
310+
{
311+
ModuleHelp_Rtmp_CreateSession(lpszClientAddr, st_RTMPCommand.ppSt_CMDProperty[i]->st_CMDOBJect.tszMsgBuffer);
312+
}
313+
}
314+
307315
BaseLib_OperatorMemory_Free((XPPPMEM)&st_RTMPCommand.ppSt_CMDProperty, st_RTMPCommand.nProCount);
308316
BaseLib_OperatorMemory_Free((XPPPMEM)&st_RTMPCommand.ppSt_CMDObject, st_RTMPCommand.nObCount);
309317
st_RTMPCommand.nProCount = 0;
@@ -326,12 +334,15 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
326334
else if (0 == _tcsxnicmp(XENGINE_STREAMMEDIA_RTMP_COMMAND_PLAY, st_RTMPCommand.tszCMDName, strlen(XENGINE_STREAMMEDIA_RTMP_COMMAND_PLAY)))
327335
{
328336
XCHAR tszSMSAddr[2048];
337+
XCHAR tszLiveName[MAX_PATH];
329338
XCHAR tszPushAddr[MAX_PATH];
330339

331340
memset(tszSMSAddr, '\0', sizeof(tszSMSAddr));
341+
memset(tszLiveName, '\0', sizeof(tszLiveName));
332342
memset(tszPushAddr, '\0', sizeof(tszPushAddr));
333343

334-
_xstprintf(tszSMSAddr, _X("live/%s"), st_RTMPCommand.ppSt_CMDObject[0]->tszMsgBuffer);
344+
ModuleHelp_Rtmp_GetSession(lpszClientAddr, tszLiveName);
345+
_xstprintf(tszSMSAddr, _X("%s/%s"), tszLiveName, st_RTMPCommand.ppSt_CMDObject[0]->tszMsgBuffer);
335346

336347
BaseLib_OperatorMemory_Free((XPPPMEM)&st_RTMPCommand.ppSt_CMDProperty, st_RTMPCommand.nProCount);
337348
BaseLib_OperatorMemory_Free((XPPPMEM)&st_RTMPCommand.ppSt_CMDObject, st_RTMPCommand.nObCount);

0 commit comments

Comments
 (0)